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%). 对于每行缺陷语句中的代码令牌
   267   268   269   270   271   272   273   274   275   276   277