Page 110 - 《软件学报》2025年第4期
P. 110
1516 软件学报 2025 年第 36 卷第 4 期
杂关系中理解复杂的代码结构和语义. 这使得模型能够考虑到缺陷的上下文信息, 进行更合理的修复.
(5) 自动化和泛用性: 大模型可以对缺陷代码进行自动修复, 不需要人工介入, 大大提高了修复效率. 同时, 由
于模型在训练阶段就已经学习了各种编程语言和领域的知识, 因此它们的泛用性更强, 可以应用于更多的修复任
务和场景, 而不是仅局限于某一种特定的程序语言.
因此大模型驱动的缺陷自动修复技术成为过去技术面对关键挑战的一个自然的解决方案, 2022 年来研究者
便尝试在自动修复系统中应用预训练大语言模型. Xia 等人 [32] 提出直接应用模型根据漏洞上下文来预测正确代码,
无需对漏洞代码进行分析的见解, 开发了基于代码模型 CodeBERT 直接进行自动修复的工具 AlphaRepair. 实验结
果表明, AlphaRepair 可以在 Defects4J 1.2 缺陷数据集上达到优异的修复效果, 修复缺陷数量上优于过去所有传统
和基于学习的缺陷自动修复技术, 并且在 Defects4J 2.0 中, AlphaRepair 达到更加优异的修复表现. 这样的结果表
明, 大模型驱动的自动修复工具的修复能力和泛化能力优于传统技术, 并且相较基于学习的缺陷自动修复技术, 基
于大模型的缺陷修复工具可以有效避免现有基于学习的技术容易过拟合等问题, 进而修复更多漏洞.
在此之后, 随着 OpenAI 公司推出的 CodeX 预训练代码大模型的性能得到工业界和学术界的广泛认可, 研究
者开始对应用大模型 (如 CodeX、ChatGPT 和其他开源模型) 到自动缺陷修复任务上进行大量实证研究. 这些工
的实证研究仅聚焦于单行修复, Huang
作主要聚焦于: (1) 大模型驱动的自动修复技术修复效果; (2) 如何更好地驱动大模型进行修复 (例如, 微调大模型
或者优化提示信息).
在 2023 年, Xia 等人 [171] 对于大模型驱动的自动修复工具的效果进行了充分的实证研究, 对包含 CodeX 在内
的 9 个代码大模型在 5 种不同的数据集上进行比较. 研究发现: (1) 直接应用最新的大模型的修复效果已经大幅度
优于所有现有的自动修复工具. 例如, CodeX 模型可以比现有最佳的自动修复技术多修复 32 个漏洞; (2) 模型的规
模效应在缺陷自动修复任务上依旧成立: 越大的模型能够修复越多的漏洞; (3) 代码大模型生成的修复补丁比传统
自动修复工具生成的补丁更加自然, 并且这样的特性可以被用于补丁排序和正确性检查. 此外该研究通过实验进
一步阐明结合大模型和传统技术可以有更好的修复效果, 为未来大模型驱动的自动修复技术提供了新的思路和方向.
由于 CodeX 代码大模型的巨大的影响力和广泛应用, Fan 等人 [188] 构建了一个基于 LeetCode 的数据集并发
现 CodeX 模型生成的代码和程序员编写的代码具有相同的漏洞特征. 他们进一步发现, 由于现有的基于模板和基
于学习的自动程序修复技术面对以下挑战: (1) 有限的搜索空间; (2) 无法生成多次编辑的修复; (3) 缺乏对程序依
赖性的认识, 导致这些技术仅能修复 CodeX 模型自动生成的代码中的一小部分缺陷. 然而有趣的是给定适当引导
的情况下 (例如修复位置), CodeX 模型表现优于基于模板和基于学习的自动程序修复技术. 最后作者尝试将 CodeX
模型和基于模板的技术结合, 发现可以生成更多的有效修复.
Jiang 等人 [189] 在单行缺陷修复任务上, 分析了代码大模型微调前后的效果, 并选择了 4 个基于学习的技术进行
比较. 具体而言, 该工作选择了 PLBART、CodeT5、CodeGen 和 InCoder 等代码大模型以及 4 个最先进的基于深度
学习的自动修复工具 CURE、RewardRepair、Recoder、KNOD 在 Defects4J 等数据集上进行比较, 得到了以下发
现: (1) 修复任务中表现最好的代码大模型在没有改变任何参数的情况下, 修复漏洞数量比最先进的基于学习的自动
程序修复技术多出 72%; (2) 代码大模型针对自动修复任务微调后能够显著提高修复能力. 该实证研究充分表明无需
任何其他设置, 直接应用代码大模型的缺陷自动修复工具在修复数量上显著优于基于学习的缺陷修复工具, 并且相
较于基于学习的缺陷自动修复技术, 代码大模型只需要在缺陷数据集上简单地微调便可以进一步提升修复能力.
不同于 Jiang 等人 [189] 等人 [45] 对于基于代码大模型的微调在多行修复
等不同实验设置中进行了详细的研究. 研究者选择了 5 个具有代表性的预训练代码大模型在 3 个不同的程序语言
上进行了大量实验. 实验结果表明, 微调后的代码大模型可以显著优于先前的最先进的缺陷自动修复工具. 相较于
传统技术只能在单行代码进行修复, 代码大模型可以在单块和多块漏洞修复方面表现出类似的性能. 然而, 对于过
于复杂的漏洞, 修复准确率随修复位置的增加而急剧下降. 有趣的是, 不同于 Xia 等人 [171] 关于大模型规模效应的
发现, 在该研究中, 作者发现较小的模型 (UniXcoder) 在修复能力方面可以与较大的模型 (CodeT5) 匹敌甚至超越,
表明对小模型的微调仍需进一步研究挖掘.
根据这些实证研究的发现, 研究者开始尝试提出更好的修复策略以进一步提升大模型在缺陷自动修复上的效果.