A deep tree-based model for software defect prediction

**题目:**A deep tree-based model for software defect prediction
**作者:**Hoa Khanh Dam, Trang Pham, Shien Wee Ng
**单位:**University of Wollongong, Australia, Deakin University, Australia
**出版:**arxiv, 2018

解决的问题


观察这两段代码,两段代码都包含一个while循环,循环的目的是将一个栈的栈顶值重复地弹出。左边代码包含缺陷:如果栈的长度小于10,那么就会发生栈的下溢。而右边代码不会出现这种问题。
对于上图的两个代码片段,以往的工作暴露出以下缺点:
- 相似的软件度量元:两段代码在行数,条件,变量,循环和分支数上完全相同,因此利用它们的度量元将完全区分不出这两段代码。在很多其他情况下也如此,两个module有相同的度量元,行为却不同,也有可能一个包含缺陷一个不含缺陷。
- 相似的代码token和频率:最近有些方法会深入到源码中,将一个代码文件表示为一个token的结合(token例如int, if等等),并且记录token出现的频率。利用token的出现频率来进行缺陷预测。而这两段代码的token以及出现频率也完全相同。因此这种方法也不能够识别出上面代码的缺陷。
- 语法和语义结构:观察上面两段代码可以看出if的位置对于缺陷是否存在至关重要。程序的语法结构同样要求代码元素对(例如try和catch,文件打开和关闭)。n-gram模型有可能抓住代码中的这种序列模式。然而n-gram往往局限于很短的序列。因此n-gram方法也存在局限。
- 语义代码token:代码元素有它们自己的语义,例如for和while在语义上是相似的,例如上面的代码中while循环可以用for循环来替代。现有工作常常忽略代码token的语义。

方法

缺陷预测重点解决的问题是一个源码文件是否包含缺陷,这个问题可以表示为一个函数predict(f),函数输入为一个文件f,函数返回1或0,表示文件包含或不包含缺陷。我们利用一系列样本(已知是否包含缺陷的文件)作为训练集来训练这个函数的参数(或者说是模型的参数)。
我们的模型利用长短期记忆网络来构建,这是一个强大的深度学习架构。我们的模型是一个树形结构的LSTM,它能够更好地反映源码的语法和多层语义信息(?)。训练后,学习到的函数用来自动地判断相同项目或是不同项目中的文件是否包含缺陷。利用一种新颖的机制,我们还能够给出是代码中的哪一行导致了缺陷。
我们的方法主要有以下几个步骤:

解析抽象语法树
  • 根结点是文件
  • 利用AST类型来标记结点(FieldDecl,MethodDecl,BlockStmt,WhileStmt)
  • 利用AST名字来标记结点(变量名,类名,方法名,属于simpleName的结点)
  • 常量按照数字或字符串的类型来标记(整数/二进制/16进制…)
  • 训练集出现而测试集未出现的标记为< unk >
  • 出现次数不在top N之中的标记为 < unk >
将AST结点映射为连续向量

随机初始化,之后跟着模型一块训练

  • 将AST embeddings输入树形LSTM来得到整个AST的向量表示。输入这种向量表示到一个传统分类器中(例如逻辑回归或随机森林)来预测缺陷

模型构建

解析源码

我们将每个源码文件解析为抽象语法树。这一过程忽略了注释,空行,标点符号和分隔符。AST中的每个结点代表源码中的一个结构。例如AST的根结点代表一个源文件,它的孩子是文件中的所有最顶层的元素,例如import和类声明。每个类声明结点有多个子孩子,代表类中的字段或方法声明。方法声明结点也有多个孩子结点,代表方法名,参数,返回值和函数体。
我们将每个结点用它的AST类型来标注(例如FieldDeclaration, MethodDeclaration, BlockStmt, WhileStmt)或是当结点类型为SimpleName时用它的名字来进行标注(例如变量名,类名,方法名)。常数,指数,16进制数和字符串结点用它们的数据类型来标记。
我们把整个数据集中为AST结点打的这些标签收集起来组成一张表,并且过滤掉少量出现次数极少的标签,并且把在测试集中出现而训练集中没有出现的结点标记为< unk >。一个固定大小的词汇表由此构建起来,其中包含出现次数多的结点label,出现次数少的结点label同样用< unk >表示。

嵌入AST结点

为把AST结点输入LSTM模型,我们需要把AST结点映射为长度固定的连续向量。我们将这种AST结点嵌入方式称为ast2vec。
这一过程利用了一个嵌入矩阵 Mdx|V| M ∈ R d x | V | ,其中d是AST结点向量的长度,|V|是词表的长度,每个AST结点标签在词表中都是一个索引。嵌入矩阵相当于一个字典,一个AST结点对应对应M中的一列。这种嵌入的方法有两个优点:第一,和one-hot相比,嵌入向量的维度较低。第二,在嵌入空间,经常在相似上下文中出现的结点会有相似的表示,也就是说具有相似语义的代码元素会有相似的表示。嵌入矩阵是随机初始化的,然后会随着训练的过程进行调整。

缺陷预测模型

  • h_{root} h_{root} 为输入传统分类器的向量
  • 训练LSTM模型:1)将一个AST分支输入到LSTM单元中,得到分支父结点的标签预测 2)比较预测结果和实际结果的不同 δ δ 3)调整参数使得损失 δ δ 最小
  • 损失函数论文中没有给出
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值