Page 272 - 《软件学报》2024年第4期
P. 272
1850 软件学报 2024 年第 35 卷第 4 期
表 2 缺陷语句作为输入时的定位效果 表 3 缺陷方法作为输入时的定位效果
数据集 方法 Top-1 Top-3 Top-5 MFR 数据集 方法 Top-1 Top-5 Top-10 Top-20 MFR
(%) (%) (%) (%) (%) (%) (%)
基准方法#1 26.1 65.9 86.7 3.2 基准方法#1 3.7 25.3 40.9 57.9 38.7
CoCoNut 基准方法#2 61.7 76.5 89.9 2.7 CoCoNut 基准方法#2 14.0 31.9 41.9 48.3 32.1
BEEP 63.8 83.9 91.2 2.3 BEEP 46.9 74.2 85.5 95.2 3.9
基准方法#1 36.7 84.1 94.0 2.5 基准方法#1 0.7 10.4 22.3 40.5 42.0
ManySStuBs4J 基准方法#2 36.9 86.3 97.2 1.7 ManySStuBs4J 基准方法#2 8.1 20.9 33.6 46.2 28.9
BEEP 85.2 96.3 100 1.3 BEEP 30.7 56.4 72.6 90.1 6.7
基准方法#1 18.2 49.4 83.1 2.8 基准方法#1 1.3 13.3 25.3 45.3 65.1
Defects4J 基准方法#2 23.9 61.8 86.7 1.9 Defects4J 基准方法#2 3.0 23.9 29.8 31.3 32.1
BEEP 86.7 91.4 96.8 1.4 BEEP 34.9 57.1 68.2 87.3 6.5
我们注意到基准方法#1 的表现与 Liu 等人的观察较为一致, 能够提供较为有效的定位结果, 基准方法#2
的表现在大体上也要优于基准方法#1. 然而, 在 3 个数据集上, BEEP 在所有评价指标下的表现都要优于两个基
准方法. 当输入是缺陷方法时, 对于 46.9%/30.7%/34.9% 的来自于 CoCoNut/ManySStuBs4J/Defects4J 数据集的补
丁, BEEP 能够准确地将缺陷代码令牌排在第 1 位. 与之对应的是, 在这 3 个数据集上, 基准方法#1 仅能分别将
3.7%/0.7%/1.3% 的缺陷代码令牌排在第 1 位; 基准方法#2 仅能分别将 14.0%/8.1%/3.0% 的缺陷代码令牌排在
第 1 位. 此外, 我们也注意到, BEEP 在绝大多数缺陷程序中 (超过 90%) 能够将缺陷代码令牌排在输出结果的
前 20 位. 特别是, 对于 ManySStuBs4J 数据集中的所有缺陷, 当输入为缺陷语句时, BEEP 都能将缺陷令牌排在
输出结果的前 5 位 (表 2). BEEP 的 MFR 值较基准方法领先了一个数量级. 例如, 在 Defects4J 数据集中, BEEP
的 MFR 值为 6.5, 而基准方法#1 的 MFR 值为 65.1. 当输入是缺陷语句时, 我们也可以观察到相似的现象. 值得
注意的是, 在此条件的输入下, BEEP 能够将 ManySStuBs4J 数据集中所有缺陷程序的缺陷代码令牌排在输出列
表的前 5 位.
综上所述, BEEP 能够有效预测缺陷程序中的缺陷令牌, 并显著优于一种基于统计的基准方法与一种基于机
器学习的基准方法.
为了探究使用 BEEP 进行细粒度的缺陷定位能为开发人员节省多少人工调试的开销, 我们进一步调查了 3 个
数据集中缺陷方法与缺陷语句中所含代码令牌的数量. 在进行数据统计时我们对于 Java 语言的关键词 (例如: if,
int 等) 不作考虑. 图 5 展示了统计结果.
Defects4J Defects4J
ManySStuBs4J ManySStuBs4J
CoCoNut CoCoNut
0 50 100 150 200 250 300 350 400 0 2 4 6 8 10 12 14
个数 个数
(a) 缺陷方法 (b) 缺陷语句
图 5 每个缺陷方法与缺陷语句中的代码令牌数
对于 CoCoNut/ManySStuBs4J/Defects4J 数据集来说, 每个缺陷方法中所包含的代码令牌数的中位数为
38/72/67. 根据表 3 中的数据, BEEP 在 3 个数据集上的 MFR 值分别为 3.9/6.7/6.5. 这一结果说明缺陷代码令牌在
BEEP 预测结果中很靠前的位置即可被找到 (通常位于所有代码令牌的前 10%). 对于每行缺陷语句中的代码令牌