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,1821] .
                    语言序列或语料库的自然性一般由语言模型度量的交叉熵(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] )的预测性能不佳,但通过特
   298   299   300   301   302   303   304   305   306   307   308