Page 282 - 《软件学报》2026年第5期
P. 282
刘书宁 等: 基于代码变更语义分析的缺陷隔离方法 2161
4.1 RQ1 实验结果与分析
● RQ1: 与增量调试方法相比, DISAC 方法在缺陷隔离任务中的性能如何?
针对回归缺陷数据集, 我们通过隔离并回滚引发缺陷的变更代码子集, 再执行测试进行验证, 如果测试通过,
意味着隔离出的变更代码子集中包含了引发缺陷的变更, 即确定了缺陷的位置. 对于 Defects4J 数据集, 我们隔离
和回滚可能修复缺陷的变更代码子集, 再执行测试进行验证, 如果测试失败, 意味着该变更代码子集中包含了修复
缺陷的变更, 即确定了缺陷的位置. 我们按照 hunk 数量大小分为 4 组, 实验结果分别如表 3、表 4 所示. 表中各列
加粗的数值表示各方法中的最佳值.
表 3 在 Defects4J 数据集上增量调试方法与 DISAC 方法的实验结果 (共 809 条数据)
低位区间 (1–4) 次低区间 (5–8) 次高区间 (9–12) 高位区间 (13–16) 离群值区间 (17+)
共419条 共161条 共85条 共63条 共81条 全部数据
方法
约减率 约减率 约减率 约减率 约减率 约减率
#成功 #成功 #成功 #成功 #成功 #成功
(%) (%) (%) (%) (%) (%)
ddmin 378 25.44 133 50.02 55 50.88 39 60.01 53 64.02 658 38.00
ProbDD 378 24.77 133 44.36 55 43.66 39 41.89 53 42.57 658 32.91
C2D2 404 25.76 141 49.89 64 51.83 42 59.71 51 64.47 702 38.23
DISAC 391 25.03 139 47.66 60 49.24 45 55.62 48 64.23 683 35.36
DISAC+C2D2 391 26.11 139 52.32 60 52.33 45 61.65 48 69.19 683 39.59
表 4 在回归缺陷数据集上增量调试方法与 DISAC 方法的实验结果 (共 1 025 条数据)
次高区间 高位区间 离群值区间
低位区间 (1–46) 次低区间 (47–92) (93–138) (139–176) (177+) 全部数据
共643条 共142条
方法 共67条 共51条 共123条
约减率 约减率 约减率 约减率 约减率 约减率
#成功 #成功 #成功 #成功 #成功 #成功
(%) (%) (%) (%) (%) (%)
ddmin 453 41.78 77 47.19 38 26.96 19 37.75 33 27.08 620 40.03
ProbDD 481 35.32 81 35.84 40 22.90 23 11.18 39 3.25 664 30.62
C2D2 485 52.07 70 48.98 31 40.55 10 27.91 9 7.98 605 45.06
DISAC 490 48.42 79 41.51 48 41.83 29 38.74 51 29.36 697 45.84
DISAC+C2D2 490 56.38 79 49.45 48 49.71 29 44.15 51 34.68 697 53.72
在 Defects4J 数据集上进行缺陷修复约减的实验结果如表 3 所示, 总体就成功数量而言, DISAC 产生了 683
条成功隔离的数据, 比 ddmin 和 ProbDD 多 3.80%, 比 C2D2 少 2.78%. 就约减率平均值而言, DISAC 的结果分别
比 ddmin 和 C2D2 低 2.64 和 2.87 个百分点, 比 ProbDD 高 2.45 个百分点. 由于 Defects4J 数据集中数据 hunk 数量
较小, 特别是低位区间里的很多数据, 变更代码全集即为隔离到的缺陷, 而其余各个区间的表现差别不大.
在回归缺陷数据集上进行缺陷引入约减的实验结果如表 4 所示, 就成功数量而言, DISAC 产生了 697 条成功
隔离的数据, 比 ddmin 多 12.42%, 比 ProbDD 多 4.97%, 比 C2D2 多 15.21%. 就约减率平均值而言, DISAC 的结果
比 ddmin 高 5.81 个百分点, 比 ProbDD 高 15.22 个百分点, 比 C2D2 高 0.78 个百分点. 从各个区间的表现来看, 在
低位区间和次低区间上, DISAC 方法的成功案例数和 DD 方法差别不大, 约减率比 C2D2 低 3.65%; 而在次高区间
和高区间上, DISAC 方法的成功案例数和约减率均显著高于所有 DD 方法.
由此可见, DISAC 算法在 Defects4J 数据集和较小的回归缺陷数据集上的约减效果略差于 DD, 但是在较大规
模的回归缺陷数据集上优势显著, 成功隔离数和约减率均有提高. 具体来看, 在成功隔离数上, DISAC 没有正确隔
离的原因主要分为两种情况, 一方面是依赖关系构建不准确, 依然有部分依赖关系因没有被检测到而被拆分, 导致
查找过程中存在编译失败. 另一方面是模型拆解的不准确, 没有在缺陷变更隔离的二分查找过程中得到导致测试
结果从 PASS 转变为 FAIL 的提交 c bug . 在约减率上, DISAC 隔离到的缺陷包含上下文, 是具有某一开发活动的代
码块的集合, 因此在部分数据中比 DD 的结果粒度更大.

