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

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

                 Key words:    software quality assurance; defect prediction; code naturalness; slice granularity; language model; cross-entropy; deep learning

                    随着信息技术的快速变革,软件已全面渗透至现代社会中,人类正在步入“软件无处不在、软件定义一切、
                                  [1]
                 软件使能一切”的时代 .然而,随着系统规模与复杂性的快速增长、不同新软件模式的广泛运用,软件系统内外
                 各种非确定性不断增强,软件质量问题日渐突出.当软件缺陷(defect)一旦在航天、交通、军事等安全攸关领域
                 被触发,所导致的后果和损失是巨大的.由于软件系统的机理及复杂性决定,软件缺陷常常不可避免.为此,如何
                 有效地预测、发现并排除缺陷,提高软件质量及可靠性已成为人们关注的重要问题.
                    鉴于此,软件工程领域研究者提出了软件缺陷预测(software defect prediction)技术              [2,3] ,其目的在于提前预
                 测可能存在缺陷的软件模块(如文件和函数).该技术通过从软件历史仓库中提取相关度量元(metrics,也称作特
                 征)来表征被预测的软件模块,然后将这些度量元输入给预测模型(如分类器、回归器等)进行训练,进而对新产
                                                [4]
                                                               [5]
                 生的软件模块预测其存在缺陷的可能性 .其研究意义在于 :及时发现缺陷,提高软件质量;优化资源分配,节省
                                                                                               [2]
                 维护成本.从软件缺陷预测的一般过程来看,影响系统实际应用效果的关键因素包括以下 3 个方面 :度量元的
                 设计、预测模型的构建方法、数据集的相关问题.为增强缺陷预测系统的性能与能力,不少学者致力于从这些
                 关键因素出发进行突破与创新.从调研情况来看,近年来,该领域的研究成果呈增长趋势,相关研究热度持续升
                  [6]
                 高 .然而,现有工作还存在一些不足,亟待解决的挑战有:
                    挑战 1.设计更具判别力的度量元,并兼顾性能与可解释性.为缺陷预测模型设计有效的度量元一直是研究
                 者关注的核心问题      [3,7] .近年来迅速兴起的深度学习方法已开始在软件缺陷预测领域发挥着重要作用,其往往能
                 够带来远超传统方法的性能.但深层网络结构自动生成的语义度量元还缺乏物理含义,可解释性差,且大多数
                 “免模型(model free)”的深度学习算法仍被视作“黑箱”.鉴于此,不少学者呼吁兼顾模型性能与可解释性                          [8,9] .
                    挑战 2.更多关注细粒度缺陷预测.由于细粒度缺陷预测聚焦的模块规模更小,因此其更有利于定位故障、
                 缩小测试和审查范围.但从已发表的文献来看,现有工作主要针对粗粒度软件实体                            [2,5] ,如包级或文件/类级,而对
                 细粒度缺陷预测问题的研究较少.鉴于此,学术界和产业界均对细粒度缺陷预测提出了更多需加以关注的呼
                 声 [2,5,6,10,11] .
                    近年来兴起的基于语言模型的代码自然性(code naturalness)分析技术               [12] 为挑战 1 提供了一种新的思路.语
                 言模型源自统计自然语言处理(natural language processing,简称 NLP)      [13] ,其可通过语料库学习捕获语言发生规
                 律和使用模式.借助这种能力,语言模型可以挖掘软件语料库,衡量代码的自然性,通常有缺陷的代码更加“不自
                 然” [14] .代码自然性一般由语言模型度量的交叉熵(cross-entropy,简称 CE)值来加以表征              [15,16] ,受语料库及模型影
                 响,代码的自然性特征具有不确定性.受已有工作启发,本文提出了一种基于代码自然性特征的缺陷预测方法(a
                 Code Naturalness feature based Defect Predictor method,简称 CNDePor).该方法针对现有语言模型仅对代码进行
                 单向度量和未能利用缺陷信息的不足构建了一种改进的神经语言模型(neural language model,简称 NLM).该模
                 型一方面利用软件质量信息对样本加权,增强/抑制了模型对无/有缺陷代码的学习强度,提升了 CE 类度量元的
                 缺陷判别力;另一方面还实现了对输入序列的正逆双向学习,得到的两种改进度量元更全面地刻画了代码的自
                 然性.基于该模型,CNDePor 方法将缺陷预测阶段训练样本的标签信息共享给 NLM 学习,然后将语言模型度量
                 的自然性特征与传统软件度量元相结合,一同输入给预测模型,从而改善了缺陷预测性能.
                    程序切片(program slicing)是一种分析和理解程序的技术            [17] ,它善于从被测程序中抽取出满足准则要求的
                 有关语句,忽略许多与此无关的语句.为此,借鉴程序切片的优势来研究缺陷预测技术可为挑战 2 提供一种新的
                 视角.本文在面向语句的切片级粒度上实现了度量元设计和缺陷预测方法应用.这一预测粒度分析的软件模块
                 是由一个或多个面向语句的程序切片构成,其中切片准则依据具体缺陷类型来设计.具体地,设计了 4 种度量元,
                 包括 2 种代码自然性特征和 2 种规模特征.利用 CNDePor 方法,在两类切片粒度缺陷数据集(缓冲区错误和资源
                 管理错误)上进行了缺陷预测应用及方法验证.经统计,所使用的切片粒度模块的平均代码行为 9.16(远小于常
                 用的文件粒度模块),这非常有利于缺陷的进一步查找与确认、降低代码审查/测试成本.
                    本文的主要贡献可总结如下.(1)  提出了一种基于代码自然性特征的缺陷预测方法(CNDePor).该方法将代
   297   298   299   300   301   302   303   304   305   306   307