Page 305 - 《软件学报》2021年第7期
P. 305
张献 等:基于代码自然性的切片粒度缺陷预测方法 2223
预测方法,用于特征学习及缺陷预测,并在 4 个真实数据集上进行了应用.实验结果说明,该方法可有效检测语义
错误.为识别 Android 二进制可执行文件中的缺陷,董枫等人 [46,47] 依据关键指令集对 apk 反编译的 samli 文件进
行序列化,然后将序列化数据输入给 MLP 进行特征学习与缺陷预测.实验结果表明,相比浅层模型,DNN 性能提
升得更明显.另一项相关工作是李珍等人的缺陷检测研究 [30] ,他们为检测软件漏洞,利用程序切片技术抽取出与
漏洞敏感库函数调用/API 函数调用相关的语句,然后基于双向 LSTM 对语句的 token 序列进行分析,以检测软
件模块是否含有特定类型的安全缺陷.
综上所述,目前已有的基于深度学习方法的软件缺陷预测工作可以分为两大类(见表 1):一类是将 DNN 视作
特征融合器,即“手工设计特征+深度学习”模式,其中,DNN 用于特征的融合与变换;另一类是将 DNN 视作特征生
成器,即“原始数据+深度学习”模式,其中,DNN 分析的对象并非人类专家设计的度量元数据,而是(向量化后的)原
始软件代码,如实数编码的 token 序列、AST 节点序列等.在这类工作中,DNN 可以从原始数据中自动学习出高阶
语义特征,进而完成缺陷预测任务;但另一方面,学习出的自动特征缺乏物理含义,面临着可解释性差的问题.
Table 1 Taxonomy of software defect prediction works based on deep learning
表 1 基于深度学习的软件缺陷预测工作分类
深度学习模型 是否利用缺陷标 相关工作 深度学习模型 技术特点
的作用 签训练神经网络
无监督 Yang 等人 [38] DBN DNN 面向手工设计特征进行融合与变换;有
特征融合器 Wen 等人 [39] LSTM 监督类型中 DNN 与分类器有机融合,一同
有监督 [40]
Clemente 等人 MLP 训练;手工设计特征的可解释性强
Wang 等人 [41,42] DBN
无监督 [43]
Dam 等人 Tree-LSTM DNN 面向软件代码(源码、AST、二进制码
Li 等人 [44] CNN 等)自动生成语义特征;有监督类型中 DNN
特征生成器 Phan 等人 [45] CNN 与分类器有机融合,一同训练;自动生成的特
有监督 [46,47]
董枫等人 MLP 征可解释性差
李珍等人 [30] Bi-LSTM
无监督 本文作者 [48,49] 神经语言模型 利用 DNN 构建语言模型;基于语言模型生
语言模型建模 成表征代码自然性特征的交叉熵(CE)值;CE
有监督 本文 加权神经语言模型 类度量元的可解释性强
与上述工作不同,本文及我们的前期工作 [48,49] 是利用 DNN 构建语言模型,然后基于语言模型度量的代码
CE 类度量元完成缺陷预测任务(见表 1).因此,无论从模型角度还是度量元角度,我们的工作 [50] 均具有理论基础,
可解释性更强.其中,文献[48]提出了一种包含语料库学习、交叉熵度量和缺陷预测的三阶段方法——
DefectLearner.该方法旨在将语言模型度量的代码 token 序列的 CE 值作为一种新的代码特征引入到缺陷预测任
务中,以增强现有度量元集的预测能力,并在文件粒度缺陷预测任务中得到应用.在此基础上,考虑到代码的
AST 蕴涵了丰富的结构信息和语义信息,文献[49]以代码 AST 节点序列为分析对象进行 CE 度量元抽取,并与其
他传统度量元相结合一同用于缺陷预测.前期工作的实验结果表明,在文件粒度缺陷倾向性预测问题中 CE 类
度量元具有一定的判别力,它们与传统度量元集具有互补性,且可以提高模型预测性能.然而,这些工作尚存不
足之处:① 未有效利用样本的质量标签数据.就缺陷预测任务而言,语言模型的训练是无监督的,它们未利用软
件模块的缺陷信息,致使生成的 CE 类度量元的缺陷判别力有限;② 仅单向度量代码样本.使用的语言模型仅可
对输入的序列样本进行正向学习和度量,致使未能全面刻画软件;③ 只关注了粗粒度软件模块,未对细粒度缺
陷预测进行研究.针对这些不足,本文对已有工作进行了较大程度的改进,提出了一种可双向度量代码的监督方
法——CNDePor,并在切片粒度缺陷预测任务中进行了验证与分析,其中,方法的具体实现和验证过程见下文.
2 基于代码自然性特征的缺陷预测方法
2.1 方法框架
本文提出的 CNDePor 方法框架如图 2 所示.该方法首先利用包含质量信息的代码语料库训练一个双向神
经语言模型;然后基于此训练好的模型完成软件模块修正的交叉熵值(M-CE)和修正的逆序序列交叉熵值