Page 277 - 《软件学报》2024年第4期
P. 277
王尚文 等: 基于指针神经网络的细粒度缺陷定位 1855
综上, 对缺陷代码令牌和修复所必需的代码变换操作的成功预测降低了 NPC 值, 从而提高了补丁生成阶段的
效率.
5.5 案例分析
本节中我们将分析两个案例. 首先, 我们通过一个实例展示基于细粒度缺陷定位信息的缺陷自动修复方案能
够准确定位并修改缺陷令牌, 从而避免产生过拟合补丁; 随后我们通过另一个实例展示基于细粒度缺陷定位信息
的缺陷自动修复方案能够与已有修复技术互补 (即能够修复当前技术无法解决的缺陷) 的原因.
图 7 展示了 Defects4J 数据集中缺陷 Math-80 的标准补丁以及本文提出的修复方案与 SimFix 工具针对此缺
陷产生的补丁. 可以看到, 此缺陷是由一条赋值语句中的数值错误引起的, BEEP 能够准确定位到出错的数值, 并
从相近的代码令牌中选取合适的令牌 (即 4), 生成了与标准答案语义一致的补丁 (int j = 4 × n – 4). 而 SimFix 则是
在语句级别对补丁进行搜索, 尽管缺陷语句的可疑度排名较高, 但其并没有找到与缺陷语句相似度较高的代码用
于生成补丁; 相反, SimFix 在非缺陷处生成了一个过拟合补丁. 这个案例表明, 本文提出的修复方案取得高准确率
的原因在于, 精准的令牌级缺陷定位与修复可以避免过拟合补丁的产生.
图 7 缺陷 Math-80 的标准补丁与两种修复方法生成的补丁
图 8 展示了 Defects4J 数据集中缺陷 Math-79 的标准补丁. 修复这个缺陷需要将源程序中两个数据类型 int 转
化为 double. 这是一个多点缺陷 [76] 的案例, 即修复该缺陷需对源程序的多个地方进行更改. 已有技术在定位到缺陷
语句后, 往往忽视其中的变量类型, 仅针对变量的赋值内容等搜索补丁, 缺乏专门针对数据类型的变异操作, 因而
不能解决这一缺陷. 在基于 BEEP 预测结果与启发式规则的修复方案中, 两条标准操作路径排在 BEEP 预测结果
的前两位. 在将操作路径两两组合后, 根据设计的启发式规则, 本文提出的方案对数据类型进行了变换, 因而成功
生成了正确补丁. 该案例表明, 细粒度的缺陷定位可以关注到更多种缺陷的可能情况, 暴露出传统技术的盲区.
图 8 缺陷 Math-79 的标准补丁