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 是否属于无关文档变更; 通过语法解析工具解析代

