Page 276 - 《软件学报》2024年第4期
P. 276
1854 软件学报 2024 年第 35 卷第 4 期
表 6 基于细粒度缺陷定位的修复方法在真实程序上的修复有效性
修复工具 Defects4J (393) Bears (251) QuixBugs (40) Bugs.jar (1 158) precision (%)
JAID [70] 25/31 - - - 80.6
CapGen [51] 21/25 - - - 84.0
ACS [50] 18/23 - - - 78.3
FixMiner [71] 25/31 - - - 80.6
SimFix [37] 34/56 - - - 60.7
DLFix [72] 30/65 - - - 46.2
TBar [42] 43/81 - - - 53.1
CURE [45] 57/104 - 26/35 - 59.7
BEEP + 代码补全 16/16 (2) 2/2 (2) 4/4 (0) 5/5 (4) 100
BEEP + 启发式 21/21 (2) 0/0 5/5 (0) 6/6 (4) 100
综上, 基于 BEEP 预测结果的缺陷自动修复能够具有高准确率, 为解决修复领域的补丁过拟合问题提供了新
的思路.
5.4 修复效率分析
Liu 等人 [3] 的研究提供了 16 种已有方法在两种输入下 (传统的基于谱的缺陷定位结果以及直接输入标准补丁
中修改的语句) 在 Defects4J 数据集上的 NPC 值. 为了进行合理的对比, 我们假定缺陷语句已知, 将基于 BEEP 预
测结果与启发式规则的修复方案的 NPC 值与已有方法进行对比, 结果展示在图 6 中. 数据显示, 本文提出的方案
的 NPC 值中位数为 2, 显著优于基于模板的程序自动修复工具 (如 TBar 和 kPAR [36] ) 以及最新的基于启发式的修
复技术 (如 SimFix). 我们观察到有 6 个工具的修复效率要优于我们提出的方案, 其中的 3 个 (DynaMoth , Nopol ,
[74]
[73]
ACS) 使用了约束求解与程序综合的技术, 使得生成的补丁有很大的概率能够满足测试用例提供的规约; 另外 3
个 (jKali [11] , Kali-A [75] , jMutRepair [11] ) 在补丁生成的过程中仅运用了简单的修复策略, 大大简化了搜索空间, jKali
与 Kali-A 仅将条件语句的条件部分变为 true 或 false, jMutRepair 仅变更操作符. 值得注意的是, 本文提出的修复
方案的 NPC 中位数小于 5, 而该方案对每个定位到的缺陷标识符尝试产生 5 个补丁, 因此该方案取得高修复效率
的主要原因是 BEEP 能够准确定位到标准操作路径. 同时也应注意到, 我们提出的基于启发式的规则严格限制了
补丁搜索空间, 使该修复方案失去了修复更多缺陷的机会, 因此, 如何利用细粒度缺陷定位结果在保持高修复效率
的同时修复更多缺陷, 值得后续研究的深入探索.
RSRepair-A
0 30 60 90 120 150 180
jGenProg
GenProg-A
jMutRepair
kPAR
jKali
Kali-A
DynaMoth
Nopol
ACS
Cardumen
ARJA
SimFix
FixMiner
AVATAR
TBar
BEEP+启发式规则
0 5 10 15 20 25 30
NPC
图 6 几种方法的 NPC 值比较结果