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)和修正的逆序序列交叉熵值
   300   301   302   303   304   305   306   307   308   309   310