Page 108 - 《软件学报》2025年第4期
P. 108
1514 软件学报 2025 年第 36 卷第 4 期
并通过大量的实验对各种修复模板的有效性进行了全面评估. 在实验中, TBar 达到了基于模板的修复技术中最优
的修复性能: Defects4J 中 74 个错误在具有完美缺陷定位信息的情况下可以得到修复. 在后续的自动修复工作中,
TBar 多次被用作模板技术修复性能基线进行比较.
5.2.4 基于学习的缺陷自动修复技术
为进一步拓展自动修复工具的修复范围和能力, 研究人员尝试应用机器学习和深度学习技术生成补丁. 其中
广泛使用的神经机器翻译技术 (NMT) 旨在通过神经网络学习缺陷代码到修复代码的转变模式尝试将有漏洞的目
标代码翻译为修复代码. 其中神经机器翻译模型通常由编码器和解码器组成, 编码器捕捉有漏洞的代码元素和其
上下文信息, 解码器接受编码输入并生成修复补丁. 2020 年 Lutellier 等人应用神经机器翻译技术 (NMT) 构建了缺
陷自动修复工具——CoCoNuT [178] . 具体而言, CoCoNuT 采用了一种上下文敏感的 NMT 架构, 它使用两个独立的
编码器分别处理错误代码和上下文信息. 这种设计不仅减小了输入序列的长度, 提高了处理效率, 同时也能更有效
地捕捉上下文中的有用信息, 使模型可以学习并生成更复杂、更精确的修复代码. 另外, 为了应对代码修复的多样
性问题, CoCoNuT 还结合了不同复杂度的模型来捕捉错误代码和修复代码之间的多种关系. 实验结果表明,
CoCoNuT 在 6 个缺陷数据集上成功修复了 509 个缺陷, 其中 309 个缺陷是过去的自动修复工具无法修复的. 在当
发式搜索策略并提高修复性能是该技术所面对的主要挑战.
时, 该工具出众的效果展现出 NMT 模型强大的能力, 吸引了众多研究者的研究兴趣.
2021 年 Jiang 等人 [179] 提出了卷积网络实现的基于编码器和解码器的自动修复模型 CURE. CURE 主要包含
3 种策略: (1) 应用预训练的代码模型学习开发人员编写的源代码, 从而生成高可读性的补丁; (2) 实现编码感知的
搜索策略, 以提高修复补丁的有效性; (3) 利用过滤技术在推理阶段减小修复补丁搜索空间, 加速修复过程. 通过
这 3 种策略, CURE 不仅提升了修复的效率, 还可以通过更有效的搜索策略高效地查找正确的修复方案. 同年,
Zhu 等人提出了 Recoder [180] . 此方法以现有的编码器-解码器架构为基础, 旨在解决目前基于深度学习的自动修复
方法在修复效率和正确性上的不足. Recoder 的特点在于引入了两个新颖的解码技术, 用于在抽象语法树级别生成
修复. 这样的机制可以使 Recoder 生成更多语法正确的补丁, 以更少的解码步骤来修复缺陷.
2022 年 Ye 等人提出了基于 Transformer 架构的神经修复模型 RewardRepair [181] . 该模型将基于标记的语法训
练目标与基于程序执行的语义训练目标相结合. 在训练期间, 该模型还将修复补丁的执行信息应用于损失函数计算
中, 从而使模型学会生成可以编译且正确的补丁. 2023 年 Jiang 等人提出了基于深度学习的缺陷自动修复技术
[182]
KNOD , 该技术主要包括两个创新: (1) KNOD 使用图转换器和解码器来生成用于修复的抽象语法树, 使模型能自
然地捕获抽象语法树中的结构, 有助于模型学习抽象语法树的语法和语义; (2) KNOD 在解码器中融合了一个领域知
识蒸馏组件, 使用领域知识指导模型学习代码的语法和语义. 实验结果显示, KNOD 的修复性能超过先前其他技术.
5.2.5 传统和基于学习的技术所面对的关键挑战
基于启发式搜索, 模板和约束的传统缺陷修复技术共同面对这样的挑战: (1) 搜索空间有限; (2) 无法生成多编辑
修复补丁; (3) 对程序上下文和依赖缺乏了解. 这些挑战导致这类工具可拓展性不强, 往往需要开发者和研究人员对
特定的漏洞类型进行大量的工作 (如编写模板或者添加约束条件). 下面我们进一步分析不同技术面对的主要挑战.
基于启发式搜索的缺陷自动修复技术具有较强的通用性, 可以应用于不同规模的程序和不同种类的程序缺
陷. 该技术的核心是在搜索空间内探索有效补丁并进行验证. 因此, 合适的搜索空间和搜索策略是找到有效补丁的
关键. 众多研究者在过去的数十年中对两者进行了详细的探究, 进而发现: 启发式搜索的空间过大会导致探索效率
较低, 并且会生成大量的待验证补丁, 降低自动修复系统效率; 搜索空间过小会导致无法找出有效补丁. 最新的评
估结果表明, 该类技术修复效果有限, 并且非常依赖人工设定的启发式搜索策略. 因此, 如何精细地设置和调整启
基于约束的缺陷自动修复技术应用约束求解尝试推断程序的正确规约, 进一步指导补丁生成. 这种技术的优
点是可以充分利用已知的约束优化求解算法, 进而降低生成无效补丁的概率. 但是基于约束的缺陷自动修复技术
引入了符号执行以及约束求解等技术, 不可避免地受限于这些技术自身的局限性. 在比较复杂和大规模的代码上,
符号执行和约束求解技术由于路径爆炸等问题求解效率过低, 难以实际应用. 此外, 基于约束求解的技术还容易过
拟合并生成可读性差的代码片段, 降低补丁的可信程度并提高代码的维护难度.