Page 304 - 《软件学报》2021年第7期
P. 304

2222                                     Journal of Software  软件学报 Vol.32, No.7,  July 2021

                 征组合可以为基于传统代码度量元的方法带来性能上的改进.他们还分析了 20 个 Java 开源项目源文件的自然
                 性 [23] ,并发现有缺陷文件的 CE 值高于无缺陷文件,这一结果与 Ray 等人相吻合.Allamanis 等人                [12] 综述了近几年
                 来代码自然性分析方面的相关工作,可以看到这一方向的研究热度持续上升.

                 1.2   切片粒度软件缺陷预测
                    软件缺陷预测技术虽然已有 40 多年的历史,但现有研究工作主要针对粗粒度的软件实体                               [2,5] .考虑到粗粒
                 度方法难以精确聚焦缺陷区域,致使在实际中开发人员需要投入过多的时间和精力审查/测试可疑模块,实用价
                 值受到影响,为此,不少研究者开始呼吁向细粒度缺陷预测投入更多精力                        [5,6,10] .
                    程序切片是一种分析和理解程序的技术,它通过寻找程序内部的相关性来分解程序,再通过对分解所得程
                 序切片的分析达到对整个程序的理解.程序切片以切片准则(slicing criterion)为标准,从被测程序中抽取出满足
                 准则要求的有关语句,忽略许多与此无关的语句.因此该技术有利于故障定位、程序调试、软件测试等任务                                    [17,24] .
                 鉴于程序切片所具有的优势,已有一些学者尝试将这一技术用于软件缺陷预测问题                             [2529] .其中主要成果 [2528] 是
                 将基于切片的软件度量元用于指导缺陷预测,而并没有将程序切片得到的模块本身作为分析对象进行缺陷预
                 测研究.与此不同,王俊      [29] 提出了一种新的缺陷预测粒度——切片粒度.该粒度是通过对程序中的函数按照其在
                 程序调用图中的距离进行聚类而得到,即待测软件模块是距离近的函数重新组合形成的切片.因此,本质上,王
                 俊 [29] 分析的软件模块是一种面向函数的粗粒度切片,这种切片包含多个函数,所以该工作依然属于粗粒度缺陷
                 预测范畴.在安全缺陷检测领域,李珍等人             [30] 利用程序切片技术抽取出与漏洞敏感库/API 函数调用相关的语句,
                 构建了一个包含两类常见缺陷的程序切片模块数据集,然后为识别软件模块中是否含有漏洞提出了一种基于
                 深度学习的自动检测方法 VulDeePecker,其中,他们使用的切片为面向语句的细粒度切片                         [24] .受上述工作启发,
                 本文将在一种新的细粒度上,即面向语句的切片粒度上讨论度量元设计和缺陷预测方法.
                 1.3   基于深度学习的软件缺陷预测
                    预测模型的构建方法是影响软件缺陷预测系统性能的关键因素之一.为了建立有效的预测模型,研究者已
                 尝试使用了众多机器学习算法           [3,31] ,包括逻辑回归 [32] 、支持向量机(support vector machine,简称 SVM) [33] 、随机
                 森林(random forest,简称 RF) [34] 、字典学习 [35] 、迁移学习 [36] 和判别分析 [37] ,以及近年来迅速兴起的深度神经网
                 络(deep neural network,简称 DNN)模型等.下面重点对基于深度学习的缺陷预测工作加以介绍.
                    为了获得更具表达力的特征,Yang 等人           [38] 将深度信念网络(deep belief network,简称 DBN)模型视作一个特
                 征融合器用于 14 种变更度量元的融合与变换,然后基于新特征及逻辑回归分类器进行缺陷预测.实验结果表
                 明,在即时缺陷预测问题上,上述方法发现的缺陷数比 Kamei 等人的方法                     [11] 多出 32.2%.考虑到现有工作忽视了
                 变更与变更间的演化信息,Wen 等人          [39] 利用基于长短期记忆(long short-term memory,简称 LSTM)单元的循环神
                 经网络(recurrent neural network,简称 RNN)对变更序列进行缺陷倾向性预测,其中,每个变更由 6 类手工设计度
                 量元表征.实验结果表明,该工作较传统方法的 F1 指标提升幅度超过 31.6%.面向软件安全缺陷预测,Clemente
                 等人 [40] 收集了 3 类软件度量元并对比了多层感知机(multilayer perceptron,简称 MLP)模型与其他 4 种传统分类
                 器的预测性能,实验结果表明,DNN 模型表现最佳.
                    另一种引入深度学习方法的动机是为了减少先验知识依赖、降低人工成本.这类工作主要利用深度学习模
                 型自动生成软件代码的语义特征,从而避免了由人类专家手工设计特征带来的局限性.Wang 等人                               [41,42] 首次提出
                 一种利用 DBN 实现的无监督深度学习模型,从源代码中学习出程序的语义表示,然后输入给分类器进行缺陷预
                 测.通过大量的验证实验,结果表明,自动学习出的语义特征较传统手工设计特征显著改善了缺陷预测性能.基
                 于相似思路,Dam 等人     [43] 提出了一种用于自动学习代码抽象语法树(abstract syntax  tree,简称 AST)节点表示的
                 树结构 LSTM 网络,然后基于这些学习出的实值特征预测软件文件的缺陷倾向性.上述工作均将 DNN 用作无监
                 督的学习模型,与他们不同,Li 等人         [44] 提出了基于卷积神经网络(convolutional neural network,简称 CNN)的缺陷
                 预测方法,并证实自动学习出的特征与传统手工设计特征相结合,可以产生更大的性能提升.因此,这意味着手
                 工设计特征和自动生成特征之间存在互补性.Phan 等人                 [45] 针对代码的汇编指令序列,构建了一种基于 CNN 的
   299   300   301   302   303   304   305   306   307   308   309