Page 303 - 《软件学报》2021年第7期
P. 303
张献 等:基于代码自然性的切片粒度缺陷预测方法 2221
码正序序列和逆序序列的 CE 值作为一类新的度量元引入到缺陷预测问题中,同时利用质量信息对样本进行加
权学习,改进了原有语言模型,提升了 CE 类度量元的判别力.(2) 设计了两种新的代码度量元:修正的代码交叉
熵度量元(M-CE)和修正的代码逆序序列交叉熵度量元(M-CE-Inv).这两种度量元从不同角度刻画了软件模块
的自然性,并具有可学习性.(3) 研究了一种新的细粒度缺陷预测问题.在面向语句的切片级粒度上初步探讨了
度量元设计和缺陷预测方法应用,所做工作具有一定参考意义.
本文第 1 节介绍代码自然性和软件缺陷预测方面的研究背景和相关工作.第 2 节介绍基于代码自然性特征的
缺陷预测方法的设计与实现.第 3 节介绍面向语句的切片粒度模块生成方法.第 4 节是实验设计,介绍研究问题、
实验数据集、评价指标、实验环境与参数设置.第 5 节对研究结果进行详细分析.最后总结全文并对未来工作加以
展望.
1 相关工作
1.1 代码自然性分析
自然语言无疑是复杂的、丰富的、强大的.但在实际使用中,受认知限制和日常生活的紧迫性,大多数人类
话语都十分简单,颇具重复性和可预测性 [15,16] .受此事实启发,2012 年 Hindle 等人 [15] 开始猜想:大多数程序语言
编写的软件代码也是“自然的”,因为它们是由人类在工作中创造的,因此与自然语言话语一样,它们也可能是重
复的和可预测的.同时,它们具有有用的可预测统计特性,可以被统计语言模型捕获并用于软件工程任务.这便
是他们提出的自然性假设(naturalness hypothesis).针对这一假设,Hindle 等人基于经典的 n-gram 语言模型给出
了经验性论据.研究发现,在测试语料库上程序语言具有远比自然语言显著的“自然性”,即重复性、可预测性更
强.在此基础上,该团队围绕代码自然性先后发表了一系列代表性成果 [14,1821] .
语言序列或语料库的自然性一般由语言模型度量的交叉熵(CE)值表征 [15,16] (受语料库及模型影响,代码的
自然性特征具有不确定性),如图 1 所示.若 CE 值越低,则表明序列的发生概率越高(在平均词汇规模意义上),也
即序列更加“自然”.本质上,语言模型可以视作是一个语言学习者,通过语料库的学习,其可捕获语言发生规律和
使用模式.在挖掘语料库的过程中,语言模型会对常见的序列赋予更高的自然性,即更低的 CE 值,而罕见的序列
则反之.通常那些罕见的序列是令人惊奇的,甚至是不合理的.因此换言之,CE 值可理解为是一种序列异常度或
“惊奇度(surprisingness)” [15] 的度量,有助于帮助缺陷预测、缺陷检测等工作.
Fig.1 Measurement of code naturalness and its application in defect prediction
图 1 代码自然性特征的度量及其缺陷预测应用
考虑到编译器错误消息通常无法精确定位语法错误的实际位置(如错误的分号或大括号可能会导致文件
的许多位置被报告为错误),Campbell 等人 [21] 利用 n-gram 语言模型实现了一个自动 Java 语法错误定位器,以增
强编译器的语法错误定位效果.经实验分析发现,语法错误拥有较高的 CE 值,即是“不自然的”.进一步地,2016 年
Ray 等人 [14] 关注了有缺陷代码的自然性(不仅仅是语法错误),并提出了不自然性假设:“不自然代码更有可能是
有缺陷的”.他们利用改进的 n-gram 模型 [19] 对 10 个 Java 项目的 7 139 个 bug-fix 提交单进行了统计分析,得出了
如下发现:有缺陷的代码倾向于拥有更高的 CE 值(即不自然),会随着错误的修复代码的 CE 值而有所降低.受上
述工作启发,Jimenez 等人 [22] 探讨了代码自然性在文件级安全缺陷预测中的应用.面向 3 个知名开源系统,他们
发现 n-gram 模型度量的自然性特征(通过调整模型参数等方法获得一组特征值 [23] )的预测性能不佳,但通过特