论文阅读-自动程序修复-Automated Repair of Programs from Large Language Models

一 文章主旨:

研究了Codex自动生成的程序中的错误,并探讨了现有的程序修复(APR)工具以及新发布的Codex-e是否能够修复由大型语言模型生成的有缺陷的程序(Codex-e作为APR工具的潜力)。

现在基于大语言模型,输入自然语言,生成代码的应用非常普遍。但是生成的代码正确率很低,因为这些模型缺乏对任务描述和程序语义的深入理解。文章以GPT-3模型的后代-Codex模型,为例,试图利用自动化程序修复(APR)技术来修复Codex产生的代码错误。

自动化修复技术接受一个有缺陷的程序和一个正确性规范,通过稍稍修改程序使其满足给定的规范来生成一个固定的程序。典型的修复工具通过推理程序语义与给定的规范来生成补丁。例如,基于语义的修复工具(如SemFix、Angelix)通过使用符号执行和基于搜索的修复工具(如Gen-Prog、TBar)在预定义的补丁中搜索正确的补丁。

二 本文贡献:

(1)自动生成的代码与人工编写的解决方案存在相同的编程错误,表明自动化程序修复技术有潜力修复自动生成的代码。

(2)发现新发布的Codex编辑模式在修复错误解决方案方面与现有的Java修复工具TBar和Recoder相似或更好。

(3)作者提出了几点建议:包括增强自动化程序修复工具的修补空间、将重点从添加更多修复模式转向综合/语义为基础的方法,研究将语言模型与自动化程序修复相结合的可能性。

本文实验方向:

作者使用公共测试用例来指导修复,并使用私有测试用例来验证修复结果。

本文探讨了两个方向来修复语言模型生成的代码的错误

1.现有的APR技术(TBar和Recoder)

2.研究探讨了使用Codex-e作为自动化程序修复工具的可能性。

「利用OpenAI最近发布的Codex编辑模式(这个新功能可以使现有的程序内容发生改变。)」

三 文章关键内容概述-围绕三个问题来的

RQ1: WHAT MISTAKES DO AUTO-GENERATED CODE USUALLY MAKE?「自动生成的代码中常见的错误模式是什么?」

研究人员通过分析Codex生成的解决方案中的典型错误来验证自动编程修复(APR)技术的可行性。他们首先在LeetCode在线评测平台上运行Codex生成的五个解决方案,并将其提交到公共测试中进行验证。如果Codex生成的解决方案无法通过所有的公共和私有测试,就认为该解决方案是错误的。对于无法解决的编程任务,研究人员研究了335个错误解决方案的错误类型,包括编译错误和测试失败。然后,两位作者分别手动修复每个错误解决方案,并通过LeetCode平台进行验证。他们的目标是为每个错误解决方案构建一个正确的修复补丁,并通过比较错误解决方案和修复后的解决方案来分类错误类型。缺陷分类基于Codeflaws中的分类,包括单块和多块修复,以及语法错误和算法相关错误。

这些错误的根本原因

  • 自动生成的程序常常存在语法错误,可能是因为代码不完整或者调用了未定义的变量/函数/类。
  • Codex生成的代码中平均令牌长度为628,远低于最大允许长度2048,因此需要研究应用代码补全技术来修复自动生成的不完整代码。
  • 对于存在未定义函数的程序,需要合成函数体以解决编译错误。
  • Codex生成的程序中存在缺少/多余的闭合括号,但可以通过正则表达式匹配机制轻松修复。
  • 有191个错误解决方案使用了错误的算法来解决给定的任务,这是由于生成的解决方案与用户意图不一致。
  • Codex生成的代码中存在一些负面特征,如变量名指示错误的算法、重复的代码块和无关的辅助函数。

RQ2: HOW EFFECTIVE ARE APR TOOLS IN FIXING THE CODE PRODUCED BY CODEX?「自动程序修复工具能否有效地修复Codex生成的代码?」

介绍了使用自动程序修复(APR)工具TBar和Recoder修复LeetCode编程任务的实验结果。结果表明,Recoder生成的正确修复补丁数量比TBar多,且能够修复更多的编程任务。然而,现有的APR工具仍然存在一些限制:如无法生成多行编辑的复杂补丁,缺乏对程序依赖关系的意识等。有限的搜索空间

​​​​​​​

RQ3: Can Codex edit mode fix program bugs?

OpenAI最近发布了Codex的新编辑模式,该模式具有修改现有程序内容的能力。Codex编辑模式接受程序和自然语言指令作为输入,并根据指令输出编辑后的程序。

1.作者设计了三种构建Codex-e编辑指令的策略:


- Codex-e 𝑏𝑢𝑔:告知Codex-e存在程序中的错误并请求其修复。
- Codex-e 𝑙𝑖𝑛𝑒:利用现有的自动程序修复技术,通过统计故障定位(Ochiai)获取可能修复行的序列,作为修复提示提供给Codex-e。【指令形式为“修复第N行”】
- Codex-e 𝑠𝑡𝑚:直接使用可疑语句的程序文本而不是可疑行号作为指令,进一步探究Codex-e的响应。【形式为“修复s1”】


        对三种策略的评价:在三种不同的策略中,Codex-e stm表现最好,成功修复了16个有错误的解决方案。Codex-e bug只能学习到程序中存在错误的信息,而Codex-e line可以根据给定的错误行号修复单个或多个错误。Codex-e stm通过使用程序文本来指导语言模型,从而更好地匹配相关语句,因此表现最佳。

        对codex-e修复工具的评价:

Codex-e是一个能够在灵活位置生成补丁的工具。与现有的自动程序修复工具相比,Codex-e不受限于给定的错误行号,可以在相关上下文中修复错误。使用灵活的错误定位是Codex-e生成更正确补丁的重要特性之一。Codex-e在给定特定错误位置的情况下的有效性与没有任何位置指导的情况下的有效性几乎相当。

        ​​​​​​​A. Comparison between TBar, Recoder and Codex-e stm .

                结论:Codex-e stm优于Recoder优于TBar

                ​​​​​​​原因是:(1) Codex-e stm可以在灵活的位置生成复杂的补丁;

                                (2) Codex-e stm的训练数据集比Recoder大得多,这有助于Codex-e                         stm学习更多的修复模式。

                                (3)Recoder比TBar生成更多正确的修复,原因是基于模式的自动程序修复需要更多的修复模式或者更大的修复搜索空间。

图9显示了Recoder生成的一个独特修复解决方案。我们认为Recoder能够生成这个正确的修复是因为它的语法引导解码器可以指导它复制图9中第6行的语句并将其插入到第3行(这调用了Recoder的复制操作,复制以set.remove(i)语句为根的AST子树)。在Recoder独特修复的另一个例子(S-O-6)中,它正确地将形式为if (a && b)的分支条件替换为if (a)(这也是AST编辑操作)。这些例子表明,将AST信息编码到深度学习模型中可能有助于生成正确的补丁。将来,研究人员可以考虑将AST信息纳入到像Codex-e和AlphaCode这样的大型语言模型中。???

        B. Combine Patch Space of Different Tools.

​​​​​​​

1)单个工具(TBar/Codex-e)是否能为每个不正确的解决方案生成所有所需的补丁成分?

2)将TBar和Codex-e组合(依次运行TBar和Codex-e)是否能生成所有所需的补丁成分? 表VI显示了每个APR技术的补丁空间覆盖的不正确解决方案数量。“TBar+Codex-e”表示TBar和Codex-e的组合补丁空间。我们的结果表明,组合使用Codex-e和TBar可以成功生成9个不正确解决方案的所需补丁成分(其中2个无法由TBar和Codex-e分别生成)。

一个具体的例子:

 图10显示了一个通过将n>0更改为n!=0并插入一个边界检查nums.size()>0来修复的不正确解决方案。对于这个不正确的解决方案,我们的实验中的任何APR工具都没有生成正确的修复。然而,TBar和Codex-e可以分别生成两个所需的补丁成分。具体而言,TBar通过将错误的操作符从“>”更改为“!=”来修复第一个错误,使解决方案通过公共测试。当我们将这个部分修复的解决方案提交给LeetCode时,程序仍然失败,抛出IndexOutOfBoundsException。通过将错误消息编码到编辑指令中(“修复IndexOutOfBoundsException”),Codex-e通过附加检查nums.size()>0来成功修复错误。

通过将Codex的多个解决方案与APR相结合,可以为修复错误的解决方案提供所需的补丁元素。与仅使用APR技术修复错误的解决方案相比,Codex的多个解决方案可以提供所需的补丁元素来构建正确的修复。通过提取来自TBar和Codex-e的补丁以及TBar的补丁和Codex生成的多个解决方案的补丁元素,我们成功地识别了更多错误解决方案的所需补丁元素。

实验结果表明:

- Codex生成的程序与人类程序员生成的程序有共同的缺陷类别;
- 现有的APR技术(TBar和Recoder)在修复自动生成的程序中的bug表现不佳;
- 在适当的指令(来自故障定位的信息)下,Codex-e在代码编辑生成方面显示出初步的潜力,通过修复45%更多的错误程序,其表现优于TBar和Recoder。

这项研究的影响包括:

- 通过传统软件工程技术(例如,AST信息、故障定位)增强语言模型;
- 突显了APR技术的局限性,尤其是基于模式的approach;
- 建议APR研究的未来方向(例如,灵活的故障定位形式)。 

  • 30
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值