Page 276 - 《软件学报》2026年第5期
P. 276

刘书宁 等: 基于代码变更语义分析的缺陷隔离方法                                                        2155


                 序生成提交序列, 之后使用二分查找的方法, 找到引入缺陷的变更子集, 即隔离到的具有单一功能的缺陷引入. 该
                 方法将缺陷引入变更的组合搜索任务转化为在提交序列中的线性查找任务, 利用单一开发语义的原子提交特性及
                 其顺序依赖关系, 有效简化了缺陷定位过程.

                     依赖关系构建                                    依赖关系     强依赖关系     hunk       测试类 hunk
                                                                                  修饰类 hunk   文档类 hunk
                         变更前代码                     变更过滤                依赖分析
                                 Git diff



                         变更后代码


                      代码变更拆解                                             智能体
                                                    监测器                             Commit1  Commit2
                                                                                    refactor  feature enhance
                                                  元素   Token 监控
                                                            拆解结果
                     预合并
                                                   决策模型              评估生成器
                                                            生成解释
                                                  调用   上下文
                                                                                     Commit3   Commit4
                                                  上下文收集器                           feature enhance  add feature




                      缺陷变更隔离
                                                                      PASS    FAIL

                     拓扑排序                            二分查找                               隔离

                           Commit4 Commit1 Commit3 Commit2  Commit4 Commit1  Commit3  Commit2


                                        图 1 基于代码变更语义分析的缺陷隔离方法框架图

                  2.2   依赖关系构建
                  2.2.1    变更代码块构建
                    变更代码块的构建过程通过使用            Git 工具来检索两个版本之间的所有代码更改. 具体来说, Git 工具对比两个
                 版本的代码, 并将它们之间的差异以一种结构化的方式呈现. 每个差异块被称为变更代码块                              (diff hunk, 在下文中
                 简称  hunk), 它通常由一组相邻的具体增删代码行组成. 在本文的研究中, hunk                 被视为构成代码变更的最小单元,
                 并作为基本的分析单位.
                  2.2.2    变更过滤
                    针对给定    DIC  中的变更代码集合      H = {h 1 ,h 2 ,...,h n }, 变更过滤的目的是得到   H = H\H irrel , 其中  H irrel  表示确定
                                                                                ∗
                 与缺陷无关变更代码块的集合. 定义           h i ∈ H doc ∪ H test  ∪   H style , 则   h i ∈ H irrel , 其中  H style  表示代码风格变更,  H doc  表示文
                 档相关变更,    H test  表示测试相关变更. 变更过滤通过缩小后续拆解范围, 降低缺陷分析的复杂性, 提高缺陷隔离的
                 效率.
                    具体来说, DISAC   通过变更代码所在的文件路径和文件名使用正则检测判断                     h i  是否属于测试相关变更; 通过
                 分析变更代码所在的文件名后缀以及代码中的引用情况判断                     h i  是否属于无关文档变更; 通过语法解析工具解析代
   271   272   273   274   275   276   277   278   279   280   281