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  的结果粒度更大.
   277   278   279   280   281   282   283   284   285   286   287