多年来,漏洞修复和代码生成一直是软件开发中的核心研究主题。最近,大语言模型(LLMs)的爆炸式增长彻底改变了这一领域,为两者提供了强大的工具。本综述审查了27篇近期论文,并将其分为两组:一组专注于自动程序修复(APR)与LLM的集成,另一组聚焦于利用LLM进行代码生成。 第一组涉及针对漏洞检测与修复的新方法,包括定位语义错误、安全漏洞和运行时失败错误。APR中的工作强调了LLM在减少手动调试工作量方面的作用,通过上下文感知的修复方法推动准确性和效率提升,为自动调试带来了创新。 第二组研究代码生成,概述了为编程微调的通用LLM和任务特定模型,并提出了提升代码生成的方法,如识别符感知训练、指令级微调和语义代码结构的融合。本综述对APR与代码生成中的方法进行了对比,识别了诸如利用LLM、通过反馈循环实现迭代代码改进以及开源模型的趋势。 此外,还讨论了实现功能正确性与安全性的挑战,并为基于LLM的软件开发研究指明了未来的方向。 1 引言
近年来,大语言模型(LLMs)在自动化软件工程领域中逐渐受到关注,尤其是在漏洞修复 [18][23][19][25][12] 和代码生成 [15][21][6] 等领域。在过去十年中,自动程序修复(APR)和代码生成的使用显著增加 [8][10],从而推动了这一领域的大量研究。许多工具已被开发出来,这些工具结合了APR和自然语言处理,用于代码生成 [15][21][6],并采用多种技术,包括抽象语法树(AST)的实现、使用不同的启发式方法对可能的修复补丁进行排序、模式匹配和上下文匹配等。 在与代码相关的任务中使用LLMs显著提升了编程自动化和漏洞发现的质量与速度。这些任务包括总结代码、根据自然语言请求生成代码、修复现有代码中的漏洞,以及理解相对较大和复杂的代码库。然而,本文将重点探讨在代码生成与漏洞修复领域的研究与实践。为便于理解,我们将所涵盖的工具和论文划分为这两个类别。由于LLMs在极大规模的数据集和数十亿参数上进行训练,它们在这些工具中得到了广泛应用。相比从零开始训练模型,使用大语言模型可以更轻松地完成与编程相关的特定任务,从而带来卓越的性能和显著的优势 [18][19][25]。 与此同时,将LLMs用于APR和代码生成任务极其复杂,涵盖了多个研究领域,如基准测试、修复场景(语法错误、语义错误等)、修复技术(重新编译、二进制重写等)、修复测试(补丁生成、输入测试、共演化)等。因此,理解这一领域已经完成的工作可能十分复杂且耗时。 本文旨在总结这一快速发展的领域中已经完成的研究和工作,以帮助其他研究人员更好地理解这些工具的工作原理、在实际场景中的性能、应用领域及其局限性。我们收集了27篇论文,并总结了与这些研究相关的各种因素,包括使用的LLMs、支持的编程语言,以及由此衍生的构建语言无关的APR工具的难点、漏洞修复和代码生成的方法,以及该领域仍在研究中的挑战。 综上,本文的目标包括: 1. 收集关于使用LLMs进行APR和代码生成的研究,概述已取得的成果。 1. 阐明这些工具可用于的修复场景以及支持的编程语言。 1. 解析LLMs在修复和生成代码工作流中的集成方式及面临的挑战。 1. 讨论LLMs在与代码相关的任务中的局限性及仍在研究中的问题。