Page 165 - 《软件学报》2025年第10期
P. 165

4562                                                      软件学报  2025  年第  36  卷第  10  期



                                          Commit: 292c9bf15
                                          日期: 5/14/2021                             --- AudioPlayerFragment.java
                            Step 4: 噪音数据消除 提交内容: New media player screen  Step 3: 识别可能引入缺陷的变更  +++ AudioPlayerFragment.java
                                          --- AudioPlayerFragment.java              -----------------------------------------------
                                          +++ AudioPlayerFragment.java              - if (media.getChapters() != null){
                                          -----------------------------------------------  + if (media.getChapters() != null &&
                                                                                    !media.getChapters().isEmpty()){
                                          + if (media.getChapters() != null){
                   引入缺陷的变更
                                                                               Step 2: 识别被修复的
                                                                                   缺陷代码




                                                                                    Commit: 05606507b
                                                               Step 1: 识别缺陷修复变更     日期: 6/15/2021
                                                                                    提交内容: Fix for highlighted seek bar
                                                                                    on episode without chapters
                                                                                    修改文件: AudioPlayerFragment.java
                                                     Git 仓库
                                            图 1 原始   SZZ  算法识别缺陷的一次示例

                  1.1.2    基于注释图的  SZZ  算法  (annotation graph SZZ, AG-SZZ)
                    Kim  等人  [13] 发现使用  B-SZZ  算法进行数据标注会产生大量噪音, 有相当多的变更被错误识别为引入了缺陷,
                 并且  B-SZZ  将注释行、空白行和格式修改          (如代码缩进) 等非语义行的修改错误识别为有缺陷. 事实上这些非语
                 义代码行并不会引入缺陷, 然而          B-SZZ  算法未考虑与此. 特别是在       B-SZZ  算法的  Step 3  中, B-SZZ  错误地将涉及
                 格式修改的代码识别为有缺陷. 因此, 格式修改的代码行可能会影响                      B-SZZ  结果的正确性. 为了解决上述问题,
                 Kim  等人提出了   AG-SZZ. 在  B-SZZ  算法  Step 3  中使用注释图  [26] 来溯源代码, 相比注释命令, 注释图可以提供更
                 全面的代码修改信息       (例如增加和删除代码行).
                  1.1.3    基于元变化感知的  SZZ  算法 (meta-change aware SZZ, MA-SZZ)
                    Da Costa 等人  [14] 发现, 如果  B-SZZ  算法  Step 3  中涉及元更改  (分支更改、合并更改以及文件属性更改), 则会
                 将代码的元更改识别为引入缺陷, 然而元更改并不属于代码缺陷, 不会对项目造成影响, 而                           AG-SZZ  仍然会将其识
                 别为引入了缺陷的变更. 由于         AG-SZZ  存在上述问题, Da Costa 等人   [14] 在  AG-SZZ  的基础上进行了改进, 提出基
                 于元变化感知的      SZZ  算法, 即  MA-SZZ. 通过改进  AG-SZZ  中的注释图, 从而避免将元更改识别为代码缺陷.
                  1.1.4    基于代码重构感知的   SZZ  算法  (refactoring aware SZZ, RA-SZZ)
                    Neto  等人  [15] 观察到, 先前的  SZZ(B-SZZ、AG-SZZ  和  MA-SZZ) 算法会将重构代码行    (例如对函数名的修改)
                 识别为缺陷. 重构行会影响        SZZ  算法的  Step 2  和  Step 3, 其并不属于缺陷范畴, 所以在   Step 2  中应过滤掉重构行,
                 在  Step 3  中溯源缺陷代码时, 重构行会被作为缺陷进行溯源, 从而无法识别出正确的引入缺陷的更改. 为应对上述
                 挑战, Neto  等人  [15] 提出了基于代码重构感知的     SZZ, 他们在  MA-SZZ  的基础上集成了一种名为        RefDiff 的  Java 代
                 码重构检测工具      [27] , 通过该工具对代码行进行进一步筛选和处理, 不再将重构的代码行视为缺陷.
                    在  SZZ  识别引入缺陷的变更过程中, 这        4  种  SZZ  算法都需执行如图   1  所示的  4  个步骤. 它们相同之处在于识
                 别修复了缺陷的变更       (Step 1) 和去除掉不正确的引入缺陷的变更         (Step 4). 而不同之处在于, 识别缺陷代码行       (Step 2)
                 和识别引入了缺陷的变更         (Step 3) 时使用了不同的搜索策略. 4      种  SZZ  算法的概述参见后文表       1. 其中, 消除噪音
                 的方法对应    SZZ  的  Step 2, 在修复缺陷的变更中识别出真正含有缺陷的代码行. 搜索策略应用于               SZZ  的  Step 3, 在  Step 2
                 的基础上进行回溯, 识别出引入了缺陷的变更.
                  1.2   即时软件缺陷预测
                    传统缺陷预测技术主要用于预测文件或模块的缺陷倾向性, 属于较粗粒度的软件实体. 然而粗粒度的预测模
                 型可能会将包括数千行代码的文件识别为缺陷                [28] , 开发人员在此基础上检查并修复缺陷的工作量过于庞大. 此外,
                 一个文件可能经由多个甚至上百个开发人员修改, 很难找出引入了缺陷的开发人员.
   160   161   162   163   164   165   166   167   168   169   170