Page 283 - 《软件学报》2026年第5期
P. 283
2162 软件学报 2026 年第 37 卷第 5 期
另外, 实验结果显示, 在 Defects4J 数据集和回归缺陷数据集中, 最快的 DD 算法 C2D2 方法的平均运行时间
分别为 682.66 s 和 987.91 s, 而 DISAC 方法的平均运行时间为 93.05 s 和 118.49 s, 分别提升 633.65% 和 733.75%.
DD 算法在过程中需要不断隔离特定的代码变更子集, 执行编译和测试操作, 以逐步缩小缺陷范围. 这种反复的编
译和测试操作耗费大量时间, 尤其是在处理大型项目或复杂依赖关系时, 时间开销尤为明显, 也会出现很多超时的
情况. 相比之下, 本文提出 DISAC 方法通过结合静态分析技术, 利用大语言模型分析变更代码的语义信息以进行
拆解, 拆解后利用二分查找的方法进行, 大大减少了执行繁重的编译测试的次数, 能够以显著更短的时间提供准确
的预测结果, 在提升缺陷隔离速度的同时显著降低了计算成本.
上述实验证明了 DISAC 在缺陷隔离中的能力, 为了验证缺陷隔离结果的正确性, 本文进一步将实验结果与
Defects4J 和 C2D2 中构建的真实缺陷变更集进行对比, 在所有成功案例中未发现错误案例.
4.2 RQ2 实验结果与分析
● RQ2: DISAC 方法是否能够增强现有增量调试技术的性能?
DISAC 提供了具有语义的缺陷隔离结果, 但为了应对不同场景的需求, 本文设计了 DISAC 与 C2D2 组合的实
验, 以评估 DISAC 方法语义隔离的结果是否能够为增量调试算法提供支持. 具体而言, 在 DISAC 将提交约减到单
一功能的子提交后, 进一步应用最新的增量调试算法 C2D2, 以实现更细粒度的缺陷隔离, 期望增强现有增量调试
技术的性能.
实验结果如表 3 和表 4 最后一行所示, 在 Defects4J 数据集上, DISAC+C2D2 方法约减率比 DISAC 总体提升
4.23 个百分点, 比 C2D2 高 1.36 个百分点; 在回归缺陷数据集上, DISAC+C2D2 方法极大地提高了缺陷隔离任务
的约减率, 相比 DISAC 方法提升 7.88 个百分点, 比 C2D2 提升 8.66 个百分点. 同时, 实验结果显示, 在 Defects4J
数据集和回归缺陷数据集中, DISAC+C2D2 方法的平均运行时间分别为 571.42 s 和 758.16 s, 相比 C2D2 分别提
升 19.47% 和 30.30%.
在该实验中, DISAC 提供的初步拆分缩小了后续增量调试算法的搜索空间, 显著减少增量调试算法的调试时
间和计算开销. 通过先行的 DISAC 拆分步骤, DD 算法可在更小的搜索空间内高效地隔离缺陷, 达到更加精确的
结果, 从而在缺陷隔离中表现出较高的整体效率与准确性, 增强了现有增量调试技术的性能.
尽管该组合方法提升了增量调试的性能, 本文仍将 DISAC 设计为可独立使用的模块, DISAC 的结果保留了
变更的上下文和语义信息, 更符合实际开发需求; 同时, 该方法也支持根据开发者需求, 与 C2D2 等现有技术灵活
集成.
4.3 RQ3 实验结果与分析
● RQ3: 本文提出的 DISAC 方法中不同组成部分如何影响缺陷隔离总体方法的效果?
本文使用 Defects4J 和回归缺陷数据集进行了消融研究. 我们每次独立地禁用了预拆解模块、上下文收集器、
评估生成器, 通过消融实验验证算法中各单独部分的有效性及对算法的贡献, 这些版本分别记为 DISAC ¬preprocess 、
DISAC ¬context 、DISAC ¬evaluate . 此外, 我们还分别将代码变更拆解部分替换为仅使用依赖分析的 SmartCommit 算法,
以及仅使用大语言模型进行拆解的方案, 以验证依赖关系建模与大语言模型拆解模块的协同增益效果, 分别记为
DISAC S 和 C DISAC LLM . 然后我们观察这些消融版本在 Defects4J 和回归缺陷数据集上有效性和效率有何变化, 分
别如表 5、表 6 所示.
实验结果表明, 当预拆解模块、上下文收集器或评估生成器被禁用时, DISAC 方法在两个数据集上进行缺陷
隔离任务中各指标上的有效性均下降, 其中禁用预拆解模块和评估生成器时下降幅度最大, 这表明这些模块对缺
陷隔离任务均具有贡献. 同时, 我们发现 Defects4J 数据集中约减率的下降幅度远小于回归缺陷数据集的下降幅
度. 由于回归缺陷数据集的代码变更集平均大小大于 Defects4J 数据集中的代码变更集, 我们推断这些组件对复杂
缺陷隔离任务的贡献比对简单缺陷隔离任务的贡献更大.
具体来说, 禁用预拆解模块导致了代码变更中强依赖关系的部分没有被预先合并, 这直接影响了后续的集合
拆分过程, 更可能打破变更子集的完整性, 导致生成的子集编译通过率显著下降, 进而影响代码的整体隔离效果,

