[论文解读] An Empirical Study on Learning Bug-Fixing Patches in the Wild via Neural Machine Translation
本文提出一种神经机器翻译(NMT)方法,旨在从 GitHub 上数百万个开源代码变更中自动学习并生成真实世界的缺陷修复补丁。通过在抽象化的有错误代码与修复后代码对上训练序列到序列模型,该方法在不同候选生成数量下实现了 9–50% 的修复预测准确率,超过 82% 的情况下生成了语法正确的补丁,并在毫秒级别内完成补丁生成,充分展示了其在可扩展、数据驱动的程序修复中的强大可行性。
Millions of open-source projects with numerous bug fixes are available in code repositories. This proliferation of software development histories can be leveraged to learn how to fix common programming bugs. To explore such a potential, we perform an empirical study to assess the feasibility of using Neural Machine Translation techniques for learning bug-fixing patches for real defects. First, we mine millions of bug-fixes from the change histories of projects hosted on GitHub, in order to extract meaningful examples of such bug-fixes. Next, we abstract the buggy and corresponding fixed code, and use them to train an Encoder-Decoder model able to translate buggy code into its fixed version. In our empirical investigation we found that such a model is able to fix thousands of unique buggy methods in the wild. Overall, this model is capable of predicting fixed patches generated by developers in 9-50% of the cases, depending on the number of candidate patches we allow it to generate. Also, the model is able to emulate a variety of different Abstract Syntax Tree operations and generate candidate patches in a split second.
研究动机与目标
- 探究神经机器翻译(NMT)是否能够从开源项目代码仓库中的实际开发者变更中,学习生成真实、开发者编写的缺陷修复补丁。
- 从 GitHub 上开源项目的变更历史中提取并抽象出有意义的有错误-修复代码对(BFPs)。
- 评估基于 NMT 的模型在生成语法正确且语义相关补丁方面在可行性、质量和效率方面的表现,以应对真实缺陷。
- 评估模型在多大程度上能够模拟实际开发者修复中常用的抽象语法树(AST)操作。
- 探索利用大规模真实代码历史作为训练数据,以构建数据驱动的程序修复系统之潜力。
提出的方法
- 作者从 GitHub 代码仓库中挖掘数百万个缺陷修复提交,以收集真实世界的有错误与修复后的代码对。
- 通过将标识符和字面量替换为占位符,对源代码进行抽象化处理,以保留语法和结构模式,同时去除噪声。
- 采用编码器-解码器神经网络架构,利用带有注意力机制的序列到序列学习方法,将有错误代码(源)翻译为修复后代码(目标)。
- 在 10% 至 90% 的训练数据上训练模型,以评估可扩展性与性能之间的权衡,尽管完整的训练曲线留待未来工作。
- 模型推理阶段生成多个候选补丁,基于与人工编写补丁的相似度,选择表现最佳的补丁。
- 该方法在两个数据集上进行评估:小型 BFPs(≤100 个标记)和中型 BFPs(101–200 个标记),并对补丁正确性和 AST 操作覆盖范围进行定性和定量分析。
实验结果
研究问题
- RQ1基于开源项目中实际开发者变更的现实世界代码,神经机器翻译能否有效学习生成真实缺陷修复补丁?
- RQ2NMT 模型在预测人工编写补丁方面的准确率如何?其性能如何随生成候选补丁数量的变化而变化?
- RQ3该模型在多大程度上能够模拟真实缺陷修复中常用的抽象语法树(AST)操作?
- RQ4该模型在生成候选补丁方面效率如何?是否能够实现开发工作流中的实时应用?
- RQ5训练数据规模对模型性能有何影响?在达到一定数据阈值后是否存在收益递减现象?
主要发现
- NMT 模型成功修复了 2,927 个独立的小型 BFPs(最多 100 个标记),根据生成候选补丁的数量,修复预测准确率在 9–50% 之间。
- 对于中型 BFPs(101–200 个标记),该模型在相同候选生成条件下修复了 1,869 个独立缺陷,准确率为 3–28%。
- 超过 82% 的生成补丁在语法上有效,表明其具有较强的结构正确性。
- 模型 $M_{small}$ 模拟了真实修复中 28–64% 的 AST 操作,而 $M_{medium}$ 达到了 16–52% 的覆盖度。
- 该模型在不到一秒内生成数十个候选补丁,展现出极高的推理效率,适合实时集成。
- 本研究为基于 NMT 的模型从真实世界代码变更历史中学习奠定了坚实的实证基础,推动了可扩展、数据驱动的程序修复发展。
更好的研究,从现在开始
从阅读论文到最终审阅,大幅缩短您的研究时间。
无需绑定信用卡
本解读由 AI 生成,并经人工编辑审核。