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

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


                 间建立语义关联. 单独的       DD  技术并不能有效应对这些挑战. 当前软件工程领域内的代码变更拆解技术具有解决
                 以上问题的能力, 这些方法通过构建变更之间代码层面的依赖关系, 将代码变更拆分为多个依赖完整的独立提交.
                 但是该类方法忽略了开发活动层面的功能及语义信息, 导致具有依赖关系的代码变更可能隶属于两个不同的开发
                 活动, 甚至是两个独立的功能, 其拆解结果的粒度难以直接满足缺陷隔离任务需求. 此外, 即使能够拆解为较小粒
                 度, 拆解后依然面临着组合搜索问题, 组合搜索的结果可能涉及多个独立提交, 但提交之间的关系往往难以确定.
                 开发人员无法判断缺陷是由这些提交的共同作用引起, 还是源于某个单一提交. 这种不确定性使得组合搜索的结
                 果难以直接指导修复工作.
                    因此, 本文提出了一种基于代码变更语义分析的缺陷隔离方法——DISAC. 该方法由变更拆解和缺陷隔离两
                 个核心模块组成. 在变更拆解模块中, 方法使用结合了程序分析技术和大语言模型的智能体对缺陷引入提交                                 (defect
                 inducing commit, DIC) 进行分解, 得到一系列的具有单一功能语义的原子提交, 例如将               DIC  中存在对某一功能的
                 重构和增强拆成两个独立原子提交, 为后续缺陷隔离提供更高的精度. 在缺陷隔离模块中, DISAC                            对一系列原子
                 提交进行序列建模, 构建提交之间的顺序依赖关系, 确保在隔离过程中不会破坏变更间的前置依赖. 随后, 利用二
                 分查找精准定位引发缺陷的原子提交及其相关依赖并进行隔离. 与传统的                        DD  方法相比, DISAC   不仅返回了最小
                 的功能语义变更, 还保留了必要的上下文和依赖信息, 为开发人员后续的缺陷修复提供了更完整且高效的支持.
                    为了验证方法的有效性, 本文在           Defects4J 数据集  [20] 和回归缺陷集  [21] 中进行了对比实验和消融实验, 以全面
                 评估  DISAC  的性能和各组件的贡献. 对比实验结果表明, 与最先进的                DD  技术相比, DISAC  的隔离效率提升分别
                 为  633.65%  和  733.75%; 隔离效果在  Defects4J 数据集上差别不大, 但在代码变更规模较大的回归缺陷集上, 成功
                 隔离缺陷的数量提高        12.42%. 此外, 当  DISAC  与  DD  结合使用时, 隔离效率分别提升      19.47%  和  30.30%, 隔离约
                 减率分别提高了      2.36%  和  8.66%. 消融实验结果显示, 语义拆解部分各模块均对           DISAC  方法的隔离效果有较大贡
                 献. 最后, 为了评估    DISAC  对开发人员理解缺陷根因的支持能力, 本文设计了用户实验, 结果表明, 与                     DD  方法相
                 比, DISAC  提高了用户根因确定效率约        59.90%, 根因确定准确率提升约       12%.
                    综上所述, 本文的主要贡献如下.
                    ● 提出了一种基于代码变更语义分析的缺陷隔离方法. 能够有效地对引发故障的缺陷变更进行及时隔离, 提
                 升了缺陷隔离的精度和效率, 在保证其他相关功能正常运转的同时, 也为开发人员提供了有价值的缺陷变更信息.
                    ● 方法研制了缺陷隔离的工具, 并在           Defects4J 数据集和回归缺陷数据集上构建了充分的实验, 验证了相比传
                 统的  DD  方法, DISAC  在缺陷隔离任务上的效果和性能均有显著的提升. 另外, 通过用户实验证实了工具的实用性.
                    本文第   1  节介绍基于代码变更缺陷隔离研究相关工作. 第               2  节阐述本文提出的方法思路及具体细节. 第            3  节
                 介绍实验的设计, 包括实验数据、基准方法、评价指标、实验流程以及关键参数设置. 第                             4  节对实验结果进行评
                 估和详细分析. 第     5  节总结全文, 并对未来的研究工作进行展望.

                  1   相关工作

                    本节介绍了基于代码变更语义分析的缺陷隔离的相关工作, 即增量调试、变更集分解等相关工作.
                  1.1   增量调试
                    增量调试是一个在保留特定属性的同时查找元素子集的自动化过程, 元素是可以按块、行或任何指定单位进
                 行计算的源代码变更, 在缺陷隔离研究中, 增量调试算法通过最小化代码变更来定位引入缺陷的代码. 传统的增量
                 调试算法是    Zeller 等人  [7] 提出的  ddmin  算法, 它基于对元素的二分查找来实现, 用于确定两个软件版本之间的最
                 小引起缺陷的变更. 此后, ddmin      被应用于各种特定领域, Misherghi 等人       [15] 引入了  HDD, 用树结构来提高增量调
                 试效率; Heo  等人  [17] 提出了  CHISEL  方法进行代码精简, 使用强化学习选择         ddmin  中更有可能满足目标属性, 减
                 小增量调试的搜索范围, 从而增强           ddmin  的有效性. 但是  ddmin  的核心算法并没有改变. 尽管        ddmin  能够发现关
                 键变化, 但是这种算法本身的计算开销是巨大的, 因为必须测试变化元素的大量可能的组合来确定该组合是否包
                 含关键变化. Wang    等人  [18] 提出的  ProbDD  是一种不同于  ddmin  的算法, 在概率模型的指导下, 它根据测试的历史
   269   270   271   272   273   274   275   276   277   278   279