[论文解读] Learning to Generate Corrective Patches using Neural Machine Translation
本文提出 Ratchet,一种基于神经机器翻译(NMT)的系统,通过建模历史上的错误修复对来学习生成修正代码补丁。通过在修复前后的代码片段上训练序列到序列模型,Ratchet 生成的补丁在语法上有效,F1 分数为 0.29–0.83,并在五个开源项目中的实证评估中实现了 98.7% 的语法有效性。
Bug fixing is generally a manually-intensive task. However, recent work has proposed the idea of automated program repair, which aims to repair (at least a subset of) bugs in different ways such as code mutation, etc. Following in the same line of work as automated bug repair, in this paper we aim to leverage past fixes to propose fixes of current/future bugs. Specifically, we propose Ratchet, a corrective patch generation system using neural machine translation. By learning corresponding pre-correction and post-correction code in past fixes with a neural sequence-to-sequence model, Ratchet is able to generate a fix code for a given bug-prone code query. We perform an empirical study with five open source projects, namely Ambari, Camel, Hadoop, Jetty and Wicket, to evaluate the effectiveness of Ratchet. Our findings show that Ratchet can generate syntactically valid statements 98.7% of the time, and achieve an F1-measure between 0.29 - 0.83 with respect to the actual fixes adopted in the code base. In addition, we perform a qualitative validation using 20 participants to see whether the generated statements can be helpful in correcting bugs. Our survey showed that Ratchet's output was considered to be helpful in fixing the bugs on many occasions, even if fix was not 100% correct.
研究动机与目标
- 通过基于学习的技术自动化补丁生成,解决软件错误修复过程中手动且耗时的问题。
- 通过利用历史修复而非基于测试的搜索,克服基于搜索的自动化修复方法的局限性,如过拟合和不可行的搜索空间问题。
- 探究神经机器翻译是否能够有效建模并从历史代码更改中泛化,以生成新的、有效的修正补丁。
- 评估基于 NMT 的补丁生成在真实世界软件项目中的有效性,并与基于模式的基线方法进行比较。
- 通过定性的人工评估,评估生成补丁的实际实用性,即使其并非完全正确。
提出的方法
- Ratchet 采用在错误代码(源)及其对应修复(目标)对上训练的神经序列到序列(seq2seq)模型,将补丁生成视为机器翻译任务。
- 该模型将包含错误的代码片段作为输入,生成修正后的版本作为输出,利用注意力机制对输入和输出中的相关代码段进行对齐。
- 训练数据来自五个开源项目(Ambari、Camel、Hadoop、Jetty、Wicket)的版本控制历史,提取错误修复前后的代码块。
- 该模型在语句级别的代码更改上进行微调,使其能够学习在多样化编程上下文中具有泛化能力的修复模式。
- 为处理代码结构,模型将代码作为标记化序列进行处理,以保留对正确补丁生成至关重要的语法和语义关系。
- Ratchet 通过定量指标(F1 分数、语法有效性)和定性人工评估进行评估,以衡量其实际可用性。
实验结果
研究问题
- RQ1神经机器翻译模型能否有效学习从历史错误修复对中生成语法正确且语义正确的代码补丁?
- RQ2与基于模式的基线方法(如 Plastic Surgery)相比,基于 NMT 的 Ratchet 系统在修复准确性和有效性方面表现如何?
- RQ3Ratchet 生成的补丁在多大程度上能帮助开发者修复真实错误,即使其与实际修复不完全相同?
- RQ4在补丁生成方面,基于 NMT 的方法的主要失败模式是什么,特别是针对未登录词和覆盖不全的问题?
- RQ5该模型是否能跨不同软件项目泛化,并处理非错误修复类的代码更改,如重构或功能增强补丁?
主要发现
- 在 98.7% 的测试用例中,Ratchet 生成了语法有效的代码补丁,表明其输出质量具有高度可靠性。
- 在五个评估项目中,Ratchet 的 F1 分数在 0.29 到 0.83 之间,表明其相对于代码库中实际修复的性能表现强劲。
- 在所有五个项目中,Ratchet 在修复准确性方面均优于或匹配了基于模式的基线方法(Plastic Surgery)的表现。
- 通过 20 名参与者的人工评估显示,即使 Ratchet 生成的补丁并非完全正确,它们仍被认为对修复错误有帮助,凸显了其实际可用性。
- Ratchet 的主要局限性被识别为未登录词问题以及推理过程中对罕见或未见标记的覆盖不全。
- 该模型展示了超越仅错误修复的泛化能力,成功生成了用于非错误相关代码更改(如重构和功能增强)的补丁。
更好的研究,从现在开始
从论文设计到论文写作,大幅缩短您的研究时间。
无需绑定信用卡
本解读由 AI 生成,并经人工编辑审核。