Page 109 - 《软件学报》2025年第4期
P. 109
香佳宏 等: 大模型在软件缺陷检测与修复的应用发展综述 1515
基于模板的缺陷自动修复技术通过从历史已经修复的缺陷中提取修复模板. 该类技术的优势是: 开发人员人
工对缺陷特征进行分类并手动实现对应的漏洞模板, 因而针对特定类型的漏洞通常可以达到令人满意的修复效
果, 在速度和修复准确率上都有优异的表现. 然而, 基于模板的缺陷自动修复工具主要面临缺陷特征分类困难和缺
陷模板开发成本高昂等挑战. 研究表明 [183] , 在实际的程序修复中, 仅有 20% 的缺陷存在重复, 大部分缺陷无法通
过人工分类缺陷特征以提供补丁模板. 此外, 添加新的缺陷修复模板需要研究者或者专家花费大量时间提取特征
手动编写, 成本高昂. 所以, 基于模板的缺陷自动修复工具只能针对特定缺陷, 而无法应用到其他漏洞上.
为解决上述传统技术所面对的挑战, 近年来许多基于学习的缺陷修复技术被提出. 实验结果证明, 相较于基于
启发式搜索, 模板和约束的缺陷修复技术, 基于学习的技术更具有泛用性也更有效. 然而现有的基于学习的技术仍
然面临以下问题:
(1) 训练数据的质量: 现有的基于学习的缺陷修复工具需要使用历史缺陷修复数据集, 即由缺陷代码和对应补
丁构成的数据集, 对模型进行训练或微调. 研究者通常使用一些启发式策略来提取这些数据, 例如使用一些关键
词 (如 bug、fix、patch、solve 等) 来过滤提交记录 [178,180,184,185] . 然而, 这些错误修复提交记录可能包含了与缺陷修
复无关的编辑, 如代码重构或新功能实现 [186] , 导致训练数据集中存在各种不相关的提交记录和代码更改. 因而缺
(2) 补丁搜索空间: 大模型具有强大的代码生成能力, 它们可以在缺陷代码的修复过程中探索更大的搜索空
陷修复数据集的质量一直是该类技术面对的主要挑战.
(2) 训练数据的数量: 与大量的开源代码片段相比, 与漏洞相对应的修复代码数量相对较少. 为了减少数据集
中补丁代码包含其他不相关补丁代码的影响, 基于学习的自动修复工具通常将其数据集中的补丁代码的长度限制
为仅有几行 [178−180,187] , 从而进一步限制了训练数据的数量. 在这些有限的历史修复上进行训练, 基于学习的工具修
复能力可能受到限制, 导致无法修复需要多处编辑的复杂缺陷.
(3) 上下文表示: 缺陷的上下文信息对于基于学习的技术中的模型理解补丁代码修复场景是至关重要的. 当前的
基于学习的缺陷修复工具首先将上下文以纯文本 [178,179] 或结构化表示 [180,187] 的方式传递给编码器, 然后将编码后的
上下文与有缺陷的代码片段输入传递给解码器. 然而这样的方式是不自然的, 因为模型很难分析程序缺陷和上下文
编码的位置关系. 因此, 这种技术可能会忽略缺陷程序代码片段和其上下文之间的复杂关系, 影响模型的修复性能.
因此在基于学习的技术中, 仍面对: (1) 修复容易过拟合; (2) 多编辑修复有效性低; (3) 对程序依赖缺乏了解等
挑战. 并且其修复性能极大依赖于训练数据的质量和数量, 而缺陷修复数据集的搜集和清洗又是困难且耗时的工
作. 因此如何更好地收集和整理缺陷修复数据集以及如何更好地对缺陷和修复代码进行编码和学习, 仍是基于学
习的技术亟待探究的问题.
5.3 基于大模型的软件缺陷自动修复技术
相较于基于学习的技术在收集缺陷数据集, 提取代码表征和上下文信息处理方面的关键挑战, 大模型在大量
代码片段上进行无监督学习, 并且拥有很强的代码能力和上下文感知理解能力. 在其他任务上, 大模型展现了优越
的性能, 吸引了诸多研究者进一步探究应用大模型到软件缺陷自动修复任务中的效果和方法. 具体而言, 相较于传
统技术的关键挑战, 大模型在缺陷修复任务上有以下特性.
(1) 代码理解和生成能力: 预训练的大语言模型, 如 CodeX, 采用了更先进的训练技术和更大的模型规模, 在诸
多代码任务上有优异的表现. 面对程序修复任务, 这些模型能够更好地理解代码上下文, 生成更准确和自然的代
码, 从而使缺陷修复更加准确和高效.
间, 生成更多有效的修复补丁. 这意味着在需要多行编辑修复的缺陷中, 相比仅能进行单行修复的传统工具, 大模
型驱动的自动修复技术能找到更好的修复方案.
(3) 修复信息分析: 大模型在训练阶段就已经学习了大量的代码和自然语言数据, 从中学习到了常见代码的合
理逻辑和范式. 因此大模型可以使用学习到的代码逻辑和范式, 对缺陷代码进行分析进而尝试找出潜在的缺陷原
因并修复.
(4) 上下文理解能力: 在诸多下游任务上, 大模型在处理上下文信息方面表现优异, 能够在代码上下文间的复