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

2154                                                       软件学报  2026  年第  37  卷第  5  期


                 过程来估计代码变更元素是关键变更的概率, 并用贪心算法选择元素. ProbDD                      效率很高, 但它受到代码更改元素
                 彼此独立的假设的影响, 这个假设在实际代码提交中经常被打破. 而缺少依赖变更元素会导致编译错误                                  (compile
                 error, CE), 增量调试过程中为了通过测试编译, 会引入完全与缺陷无关的变更. Hashimoto                 等人  [16] 提出了  DDJ 算
                 法, 通过对源代码变更进行预处理, 对存在依赖关系的代码变更进行分组, 一定程度上解决代码变更元素之间具有
                 依赖关系的问题. 然而, 具有依赖关系的变更代码不一定都是引入缺陷的代码, 同时这种算法依然依赖                                  ddmin.
                 Song  等人  [19] 提出的  C2D2  算法是目前最新的  DD  算法, 使用基于矩阵的搜索机制, 解决缺少依赖关系导致的编译
                 错误问题, 但是在大规模数据上依然有局限性.
                    增量调试技术能够用于隔离引入缺陷的关键更改, 但由于真实代码变更中具有复杂的依赖关系, 这些依赖关
                 系导致增量调试中存在大量处理变更代码间信息传播的过程, 不仅测试过程花费大量开销, 而且最终定位到的缺
                 陷范围也可能较大, 缺陷隔离的效率和准确性受到严重限制. 与增量调试的过程不同, 本文基于代码变更的语义,
                 通过利用大语言模型对代码变更的分析, 在减少开销的同时, 解决了依赖关系对缺陷隔离的影响, 从而实现了更精
                 确地隔离引入缺陷的代码变更.
                  1.2   变更集分解
                    目前已经有了多种用于解决变更代码分解问题的方法, Herzig                 等人  [10] 使用了一种基于启发式的算法来处理解
                 开纠结变化, 他们认为它们之间的关系是信任投票者. 类似地, Wang                 等人  [11] 提出了  CoRA, 这是一种将提交分解为
                 不同部分并为审查者生成简洁描述的自动方法, 它采用了一种通过代码依赖分析和基于树的相似代码检测的启发
                 式方法来分解复合提交以进行代码审查. Barnett 等人             [22] 提出了  CLUSTERCHANGES, 它依赖于方法的定义和引
                 用等连接来聚类相同的变化. Guo         等人  [23] 提出了  CHGCUTTER  技术, 利用程序依赖关系构建相关的变更子集, 同
                 时筛选相关的测试用例, 减少了进行回归测试的时间. Muylaert 等人                [24] 基于程序依赖图和一次提交中抽象语法树
                 上的变更, 使用程序切片技术来分解复杂的变更集. Dias 等人                [25] 开发了  EpiceaUntangler, 基于代码结构预测两个
                 变更属于同一个集合的概率, 分解复杂的变更为原子提交, 并通过一些工作表明了开发人员参与分解过程的必要
                 性. Taeumel 等人  [26] 提出了一种名为  Thresher 的交互式图形工具, 采用可适应的脚本支持开发人员对变更进行分
                 组和提交, 特别是对于细粒度的更改跟踪. Yamashita 等人           [27] 提出了  ChangeBeadsThreader (CBT), 这是一种用于拆
                 分和合并变更集的交互式环境, 该环境基于              4  个度量来分解变更集, 并允许用户完全手工分割/合并变更集. Shen
                 等人  [28] 提出了  SmartCommit 方法, 提出了一种可扩展的图表示方法, 它提出了变更代码之间的多种启发式连接,
                 并设计了基于图划分的变更集分解算法.
                    本文的研究与这些工作的重要不同之处在于, 这些工作仅考虑了变更代码之间的依赖和调用关系, 本文的变
                 更集拆解方法将一次代码提交中的变更代码分解为多个具有单一活动的子提交, 需要同时考虑变更代码的语义信
                 息, 因此, 本文提出的程序分析和大语言模型的提交拆解方法, 保证了每个拆解后的变更具有独立性.

                  2   基于代码变更语义分析的缺陷隔离方法

                  2.1   总体方法框架
                    DISAC  方法主要包含    3  个主要阶段: 依赖关系构建、代码变更拆解和缺陷变更隔离, 如图                   1  所示.
                    在依赖关系构建阶段, 首先检测两个版本代码间的所有代码变更, 并将其结构化为变更代码块; 在变更过滤中
                 检测和排除与缺陷开发无关的变更活动, 如测试代码变更、非代码变更、代码风格调整等, 缩小检测规模, 降低后
                 续处理的复杂性和分析成本. 之后进行依赖分析, 基于程序分析技术构建变更代码块之间的依赖关系图, 识别变更
                 代码块之间的关联, 为后续变更集拆解提供依据.
                    在代码变更拆解阶段, 以第         1  阶段得到的代码变更依赖关系图作为输入, 首先对变更代码块之间存在的强依
                 赖关系进行预合并, 再采用基于大语言模型的智能体进行语义拆解, 直到完全分解为多个具有单一功能语义的变
                 更子集, 将分解得到的变更子集及其标签作为结果输出.
                    在缺陷变更隔离阶段, 将分解得到的每个变更子集视为一次提交, 基于变更子集间的依赖关系图进行拓扑排
   270   271   272   273   274   275   276   277   278   279   280