Helping LLMs Improve Code Generation Using Feedback from Testing and Static Analysis

📄 arXiv: 2412.14841v2 📥 PDF

作者: Greta Dolcetti, Vincenzo Arceri, Eleonora Iotti, Sergio Maffeis, Agostino Cortesi, Enea Zaffanella

分类: cs.SE, cs.AI

发布日期: 2024-12-19 (更新: 2025-01-07)


💡 一句话要点

利用测试与静态分析反馈提升LLM代码生成质量与安全性

🎯 匹配领域: 支柱九:具身大模型 (Embodied Foundation Models)

关键词: 代码生成 大型语言模型 静态分析 软件测试 代码修复

📋 核心要点

  1. 现有LLM生成的代码存在安全漏洞、错误和不良代码风格,缺乏有效的质量保障机制。
  2. 该研究提出利用测试和静态分析的反馈,指导LLM自我改进代码生成质量和安全性。
  3. 实验表明,LLM在接收到测试失败或漏洞报告后,修复代码的能力显著提升。

📝 摘要(中文)

大型语言模型(LLM)是人工智能领域中最有前景的进展之一,软件工程界已经注意到它们在软件开发生命周期中的潜在作用。开发人员经常要求LLM生成代码片段,这提高了生产力,但也可能引入所有权、隐私、正确性和安全性问题。以往的研究表明,主流商业LLM生成的代码通常不安全,包含漏洞、错误和代码异味。本文提出了一个框架,该框架利用测试和静态分析来评估通用开源LLM生成的代码的质量,并指导其自我改进。首先,我们要求LLM生成C代码来解决一些编程任务。然后,我们使用真实测试来评估生成代码的正确性,并使用静态分析工具来检测潜在的安全漏洞。接下来,我们通过要求模型检测错误和漏洞来评估模型评估生成代码的能力。最后,我们测试模型修复生成代码的能力,并提供在静态分析和不正确评估阶段生成的报告作为反馈。

🔬 方法详解

问题定义:论文旨在解决大型语言模型(LLM)在代码生成过程中产生的代码质量问题,特别是代码的正确性和安全性。现有方法生成的代码常常包含漏洞、错误和不良代码风格,缺乏有效的质量评估和改进机制。这些问题限制了LLM在软件开发中的实际应用。

核心思路:论文的核心思路是利用测试和静态分析工具对LLM生成的代码进行评估,并将评估结果作为反馈信息,指导LLM进行自我改进。通过迭代式的评估和改进,提高LLM生成代码的质量和安全性。这种方法模拟了人类程序员在开发过程中的调试和代码审查过程。

技术框架:该框架包含以下几个主要阶段:1) 代码生成:LLM根据给定的编程任务生成C代码。2) 代码评估:使用ground-truth测试评估代码的正确性,并使用静态分析工具检测潜在的安全漏洞。3) 错误检测评估:评估LLM自身检测代码中错误和漏洞的能力。4) 代码修复:将测试失败报告和静态分析报告作为反馈提供给LLM,让其尝试修复代码。

关键创新:该研究的关键创新在于将测试和静态分析的反馈融入到LLM的代码生成流程中,形成一个闭环的自我改进系统。与以往研究不同,该方法不仅关注代码生成,更关注代码的质量评估和改进。此外,该研究还评估了LLM自身检测和修复代码问题的能力。

关键设计:在代码评估阶段,使用了ground-truth测试来保证评估的准确性。静态分析工具的选择需要考虑其对C语言的支持程度和漏洞检测能力。在代码修复阶段,反馈信息的呈现方式和详细程度可能会影响LLM的修复效果,需要进行仔细设计。具体的LLM选择和prompt设计也会影响最终结果。

🖼️ 关键图片

fig_0
fig_1
fig_2

📊 实验亮点

实验结果表明,LLM在生成代码时经常产生不正确的代码,并且生成的代码可能包含安全问题。此外,LLM在检测这些问题方面的表现非常差。但积极的一面是,当提供有关失败的测试或潜在漏洞的信息时,LLM在修复有缺陷的代码方面表现出很强的能力,这表明了提高基于LLM的代码生成工具安全性的一个有希望的途径。

🎯 应用场景

该研究成果可应用于软件开发的各个阶段,例如自动化代码生成、代码审查和漏洞修复。通过集成到IDE或CI/CD流程中,可以帮助开发人员快速生成高质量、安全的代码,提高开发效率并降低安全风险。此外,该方法还可以用于训练和优化LLM,使其更好地适应软件开发任务。

📄 摘要(原文)

Large Language Models (LLMs) are one of the most promising developments in the field of artificial intelligence, and the software engineering community has readily noticed their potential role in the software development life-cycle. Developers routinely ask LLMs to generate code snippets, increasing productivity but also potentially introducing ownership, privacy, correctness, and security issues. Previous work highlighted how code generated by mainstream commercial LLMs is often not safe, containing vulnerabilities, bugs, and code smells. In this paper, we present a framework that leverages testing and static analysis to assess the quality, and guide the self-improvement, of code generated by general-purpose, open-source LLMs. First, we ask LLMs to generate C code to solve a number of programming tasks. Then we employ ground-truth tests to assess the (in)correctness of the generated code, and a static analysis tool to detect potential safety vulnerabilities. Next, we assess the models ability to evaluate the generated code, by asking them to detect errors and vulnerabilities. Finally, we test the models ability to fix the generated code, providing the reports produced during the static analysis and incorrectness evaluation phases as feedback. Our results show that models often produce incorrect code, and that the generated code can include safety issues. Moreover, they perform very poorly at detecting either issue. On the positive side, we observe a substantial ability to fix flawed code when provided with information about failed tests or potential vulnerabilities, indicating a promising avenue for improving the safety of LLM-based code generation tools.