Page 265 - 《软件学报》2024年第4期
P. 265
王尚文 等: 基于指针神经网络的细粒度缺陷定位 1843
丁数据进行分析, 提取其抽象语法树层面的代码更改, 针对每一个缺陷程序, 构建一组包含抽象语法树路径和修改
操作 (即更换 UPDATE、添加 INSERT、删除 DELETE) 的“操作路径”. 该组路径中含有一条或多条表示该补丁中
代码更改的“标准操作路径”. 模型中采用了指针神经网络 (pointer network) [17] , 其功能为从众多输入的操作路径中
预测出标准操作路径, 该路径中抽象语法树路径指向的代码令牌为缺陷代码元素, 对应的修改操作为修复该缺陷
代码元素所需的更改操作. 当应用于预测时, BEEP 的输入是一个缺陷函数, 其通过建立缺陷代码的抽象语法树,
提取抽象语法树路径并构建操作路径, 将一组操作路径送入已训练好的模型中, 返回结果即是细粒度的缺陷定位
结果. 多组对比实验验证了本文所提出的方法在细粒度缺陷定位问题上的有效性. 此外, 基于细粒度缺陷定位结
果, 我们设计了两种缺陷修复流程, 一种利用现成的代码补全工具来预测可以替换被 BEEP 识别出的缺陷代码令
牌的正确内容; 另一种使用简单的启发式方法来搜索出可以替换被 BEEP 方法识别出的缺陷代码令牌的内容. 实
验结果表明两种方法都能实现百分之百的正确率 (生成的通过所有测试套件的补丁都与开发人员提供的标准补丁
在语义上等价, 即语义正确的) 并具有较高的修复效率.
数据预处理 离线训练
...
补丁库 抽象语法树差分 抽象语法树路径&修改操作 训练
...
...
缺陷函数 抽象语法树 抽象语法树路径 预测 预测结果
图 2 BEEP 细粒度缺陷定位技术工作流程图
本文第 1 节介绍了缺陷定位与程序修复的相关方法和研究现状. 第 2 节阐述了本文所需的背景知识, 即抽象
语法树路径. 第 3 节介绍了本文构建的基于指针神经网络的细粒度缺陷定位模型. 第 4 节通过对比实验验证了所
提模型的有效性. 第 5 节探讨了基于细粒度缺陷定位的程序修复的有效性与效率. 最后第 6 节对全文进行了总结.
1 缺陷定位与程序修复相关工作
本文所涉及内容主要与缺陷定位与程序修复有关, 下面就相关研究现状给予介绍.
1.1 缺陷定位
缺陷定位旨在精确诊断缺陷位置以方便程序调试 [18] . 在众多缺陷定位技术中, 研究最广泛的是基于频谱的缺
陷定位技术 (spectrum based fault localization, SBFL) [19] . 其通常利用成功和失败测试用例的执行轨迹来识别可疑代
码元素 (例如代码行或方法). 其背后的机理是, 如果一个代码元素被更多的失败测试覆盖但却被较少的通过测试
覆盖, 那么它有缺陷的可能性就偏大. 因此, 研究人员通常应用统计分析 (例如 Ochiai [20] 和 Tarantula [21] ) 来计算代
码元素为缺陷可能性, 并按可能性大小的降序排列它们以表示缺陷定位结果. SBFL 方法的固有限制是执行了失
败测试用例的代码元素不一定表明该元素与测试失败有关. 为了解决这个问题, 研究人员还提出了基于变异的缺
陷定位 (mutation based fault localization, MBFL) 技术 [22] , 该技术对代码元素进行变异, 然后检查其对测试结果的影
响. 除了 SBFL 和 MBFL, 研究人员还探索了各种缺陷定位技术, 例如基于代码切片 [23] 、基于统计分析 [24] 、基于
程序状态 [25] 、基于学习 [26] 、基于数据挖掘 [27] 和基于模型 [28] 的技术. 也有研究人员提出利用程序修复阶段产生的
补丁信息来优化缺陷定位结果 [1,29] : 如果在识别到的缺陷位置处能生成通过所有测试用例的补丁, 则说明该定位
结果是准确的; 反之则说明该定位结果不够准确. 在近期的缺陷定位相关研究中, 研究人员试图融入更先进的机器
学习技术以获取更准确的定位结果. 例如, Zou 等人 [30] 利用排序学习 (learning to rank) 的方法将上文中提到的不同