一 论文背景
本文作者发现了“现有的传统和基于学习的APR技术面临着有限的修补程序种类的问题,无法修复复杂的漏洞。最近的研究人员直接利用大型预训练语言模型(LLMs)进行APR,而不依赖于任何漏洞修复数据集。然而现有的工作要么没有包括最先进的LLMs,要么没有在实际数据集上进行评估。
所以本文作者的创新点:首次对直接应用LLMs进行自动程序修复进行了广泛研究。研究选择了9个最新的LLMs,包括生成和填充模型,范围从125M到20B不等。研究设计了3种不同的修复设置,评估了使用LLMs生成补丁的不同方式。(最先进的LLMs+在实际数据集上进行评估。)
研究结果:
·直接应用最新的LLMs可以在所有数据集上显著优于所有现有的自动程序修复技术。
·LLMs还可以用于有效的补丁排名或补丁正确性检查。
·通过增加样本大小和结合修复模板信息,可以进一步大幅提高LLM-based APR的性能。
二 introdution
(一)研究现状
1.LLMs是以无监督的方式训练的,可以用于各种代码任务。最近,AlphaRepair提出了利用CodeBERT直接进行APR的方法,而不是学习从有错误的代码到修复代码的转换。AlphaRepair通过这种方法展示了最先进的修复结果,而无需在错误修复数据集上进行微调。
2.直接利用Codex进行生成式APR,即根据错误之前的上下文生成修复代码。然而,这些研究主要集中在Codex上,并且仅在一个包含40个简单编程任务错误的小数据集上进行评估。(之前读过这篇论文)
3.现有的LLM模型主要评估代码相关任务,如代码补全、文档生成和变量/类型预测,但评估仍主要集中在NLP指标上,不准确衡量生成代码的功能或语义正确性。
4.数据集由手工策划的代码问题组成,不准确反映开发人员在实际项目中的工作。
(二)本文主要贡献
1.对最近的LLMs进行了首次广泛评估,用于修复现实世界的项目。
2.设计了三种不同的APR实验设置:1)完整函数生成,2)正确代码填充和3)单行生成,展示了LLMs在APR中的不同应用方式。
3.包括了两种流行的LLM架构(生成模型和填充模型),以展示使用每种类型进行APR的优点和缺点。
(三)背景知识介绍
主要的语言模型有单向语言模型和双向语言模型:
1、单向语言模型即Transformer的Decoder模块。就是正向预测,即已知前面的文本信息预测下一个字。更适合生成任务,而现在主流的大模型例如ChatGPT、LLAMa所执行的所有任务均可以被归类为生成任务。这种模型通常用于诸如序列标注、命名实体识别和文本分类等任务。
2、双向语言模型就是可以利用上下文信息来预测。最主流的双向语言模型BERT,是最主流的掩码语言模型或自编码语言模型,主要基于Transformer的Encoder模块实现
自动程序修复(APR)
技术:
目前广泛使用的自动程序修复技术主要是基于专家手工指定的模板和基于学习方式的程序修复。
1)基于模板修复方式:比较依赖于专家手工制定的模板,而模板获取通常较难,且难以准确的设计:
2)基于学习的方式则需要依赖于大量的标注数据集,标注数据集的获取成本很高,也会对效果带来一定的影响。
发展:
1、传统基于专家手工指定模板和规则
2、借鉴NMT方法,基于可学习的神经网络,训练修复模型,如Seq2Seq、Transformer等
3、基于预训练大模型,做有监督微调或者不训练模型直接做zero-shot、few-shot等任务,如代码专项模型:starcoder、codex、codeBert等