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

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


                 proposes  a  defect  isolation  method  based  on  code  change  semantic  decomposition—DISAC.  The  method  decomposes  composite  commits
                 introduced  by  the  defect  into  atomic  commits  with  single  functional  semantics.  It  then  models  the  sequential  dependency  between  commits
                 to  ensure  that  the  dependency  chain  will  not  be  broken  during  the  isolation  process.  Compared  to  the  traditional  DD  methods,  DISAC  not
                 only  returns  the  smallest  functional  semantic  changes  but  also  preserves  necessary  context  and  dependency  information,  thereby  providing
                 developers with more complete and accurate support for defect repair. Experimental results show that compared to the DD method, DISAC
                 significantly  improves  defect  isolation  efficiency  and  accuracy.  Specifically,  the  isolation  efficiency  is  increased  by  633.65%  on  the
                 Defects4J  dataset  and  by  733.75%  on  the  regression  defect  set.  Additionally,  when  DISAC  is  combined  with  DD,  the  isolation  reduction
                 rate  improves  by  2.36%  and  8.66%  respectively,  significantly  enhancing  isolation  effectiveness.  User  experiments  show  that  DISAC
                 increases  root  cause  determination  efficiency  by  approximately  59.90%  and  improves  accuracy  by  12%.  These  results  demonstrate  that
                 DISAC  not  only  improves  defect  isolation  accuracy  but  also  reduces  unnecessary  change  combination  attempts,  thus  showing  higher
                 efficiency and stability in defect isolation tasks committed by complex codes.
                 Key words:  defect isolation; code change; semantic analysis; large language model (LLM)
                    在现代软件开发中, 为了快速响应不断变化的需求, 频繁的代码提交和更新已成为常态. 这种高频率的变更虽
                 然加速了功能实现, 但也增加了缺陷被引入的风险                [1−3] . 尽管持续集成  (continuous integration, CI) 等工具能够及时
                 检测缺陷提交, 但其本身并不具备识别引发缺陷的具体变更的能力, 难以在不影响提交中正常功能的前提下恢复
                 系统的运行, 仍需开发人员迅速定位缺陷问题, 并将缺陷相关的变更剥离出来, 但这一过程耗时耗力, 严重增加软
                 件维护的成本.
                    因此自动化缺陷隔离方法成为解决这一问题的关键手段. 该方法可在检测出缺陷提交后, 进一步精准定位引
                 入缺陷的代码变更, 并将其从其他代码中剥离. 通过回滚这些变更, 系统可以快速恢复到缺陷出现前的稳定状态,
                 从而避免缺陷对整体功能的影响. 这一方法不仅能够有效应对因频繁变更而引发的质量风险, 还为后续精确修复
                 提供了时间, 是保障系统稳定性和开发效率的重要工具                 [4−7] .
                    缺陷隔离是一项复杂且具有挑战性的任务               [8,9] . 在实际开发中, 由于不规范的开发流程, 单次代码提交往往包
                 含多个不同的开发活动, 这种“复合提交”现象使得缺陷隔离难度进一步加大                       [10−12] . 例如, 开发人员可能在一个提交
                 中同时完成对多个功能的增强、代码重构或性能优化等变更. 当系统因缺陷出现故障时, 开发人员需要从这些交
                 织的变更中精准定位引入缺陷的部分, 并对其进行回滚, 同时避免对其他功能或开发活动的代码产生影响. 复合提
                 交的复杂性要求开发人员对提交内容进行详细的分析, 以明确每个变更的作用及其关联性. 在此基础上, 开发人员
                 才能有效隔离缺陷相关的代码, 从而快速消除问题并保持其他代码的完整性和稳定性.
                    增量调试    (delta debugging, DD) [13] 是软件工程领域经典的缺陷隔离方法. 其核心思想是通过逐步回滚代码变
                 更组合, 实现对缺陷的隔离. 对于代码变更集合             X, 定义函数   f (X) = {T,F}, 其中   f  表示回滚指定代码变更集并进行
                                                                                         ∗
                                                                                                    ∗
                 编译测试, 返回值     T  表示缺陷未发生,    F  表示缺陷被触发. DD    的目标是找到最小的变更子集           X ⊆ X  使得  f (X ) =T,
                                                            X  是一个非确定性多项式        (non-deterministic polynomial,
                                                             ∗
                 即通过回滚后缺陷消失的最小代码变更组合. 由于寻找
                 NP) 困难问题, DD  采用分治思想折半尝试变更组合, 其过程由测试反馈驱动, 逐步缩小缺陷范围, 最终准确隔离引
                                             ( )                               [7]
                 入缺陷的代码变更. 理论上, DD       以  O n 2   的时间复杂度完成缺陷引入变更的查找           .
                    DD  技术能够将缺陷隔离到最小变更单元             (如行级别)  [14] 在软件实践中展现了重要价值, 但其效率受限于大量
                 测试的需求. 尽管研究人员们对其性能进行了系列优化                 [15–18] , 但最新研究表明, DD  仍存在显著局限性     [19] : (1) 随着
                 变更集合规模增大, DD      性能显著下降. 其递归缩小测试范围进行隔离的方式, 导致测试次数和时间开销呈指数级
                 增长. 在资源有限或测试成本较高的场景中, DD             可能因耗时过长而难以给出结果. 这限制了              DD  在大规模代码库
                 和复杂提交情境中的适用性. (2) DD        缺乏对代码变更语义信息的利用能力. 其隔离过程仅依赖测试结果的变化, 而
                 未充分考虑变更背后的功能关联和开发意图, 可能导致隔离结果中包含与缺陷无关的代码变更                                (如功能增强或代
                 码重构). 这些多余变更的回滚不仅无助于缺陷修复, 反而可能破坏系统功能或干扰其他开发活动. (3) 即使                             DD  能
                 够隔离出最小缺陷变更, 其结果往往缺乏必要的上下文信息. 孤立的变更片段可能无法准确呈现缺陷的完整背景,
                 开发人员仍需回溯原始变更集以理解缺陷的根源或评估影响范围, 增加了工作负担并延长了修复周期.
                    解决上述问题面临着两大挑战: 一方面是如何对复杂变更任务进行合理拆解; 另一方面是如何在代码变更之
   268   269   270   271   272   273   274   275   276   277   278