Repair-R1: Better Test Before Repair

📄 arXiv: 2507.22853v1 📥 PDF

作者: Haichuan Hu, Xiaochen Xie, Quanjun Zhang

分类: cs.SE, cs.AI

发布日期: 2025-07-30

🔗 代码/项目: GITHUB | HUGGINGFACE


💡 一句话要点

Repair-R1:提出一种先测试后修复的自动化程序修复方法,提升修复成功率。

🎯 匹配领域: 支柱二:RL算法与架构 (RL & Architecture) 支柱九:具身大模型 (Embodied Foundation Models)

关键词: 自动化程序修复 大型语言模型 强化学习 测试用例生成 缺陷定位

📋 核心要点

  1. 现有基于LLM的APR方法主要在推理阶段使用测试用例,忽略了测试用例在训练阶段的价值以及修复前测试的潜力。
  2. Repair-R1的核心思想是将测试用例引入训练阶段,并先生成测试用例再进行修复,从而帮助模型更好地理解缺陷。
  3. 实验结果表明,Repair-R1在修复成功率、测试生成成功率和测试覆盖率方面均优于现有方法,提升显著。

📝 摘要(中文)

自动化程序修复(APR)旨在自动定位程序缺陷、生成补丁并验证修复。现有的APR技术通常与大型语言模型(LLM)结合,利用LLM的代码相关知识来提高修复效果。目前基于LLM的APR方法通常仅在推理阶段使用测试用例,采用先修复后通过测试执行验证的迭代方法。这种传统模式忽略了两个重要方面:测试用例在训练阶段的潜在贡献,以及在修复之前利用测试的可能性。为了解决这个问题,我们提出了Repair-R1,它将测试用例引入模型的训练阶段,并将测试生成移至修复之前。该模型需要首先生成能够区分缺陷行为的判别性测试用例,然后基于这些测试执行修复。这使得模型能够更好地定位缺陷并理解缺陷的根本原因,从而提高修复效果。我们使用三种不同的骨干模型实现了Repair-R1,使用强化学习(RL)共同优化测试生成和错误修复。在四个广泛采用的基准测试上的实验结果表明了Repair-R1的优越性。特别是,与原始模型相比,Repair-R1将修复成功率提高了2.68%至48.29%,测试生成成功率提高了16.38%至53.28%,测试覆盖率提高了0.78%至53.96%。

🔬 方法详解

问题定义:现有的基于LLM的自动化程序修复方法,通常采用先修复后测试的策略,未能充分利用测试用例在训练阶段的价值,也忽略了在修复前进行测试的可能性。这种方式导致模型难以准确定位缺陷,并深入理解缺陷的根本原因,从而限制了修复效果的提升。

核心思路:Repair-R1的核心思路是“先测试,后修复”。具体而言,它将测试用例生成提前到修复之前,并将其纳入模型的训练流程中。通过要求模型首先生成能够有效区分缺陷行为的测试用例,然后再基于这些测试用例进行修复,从而使模型能够更好地理解缺陷的本质,并生成更有效的修复补丁。

技术框架:Repair-R1的整体框架包含两个主要阶段:测试用例生成阶段和程序修复阶段。这两个阶段通过强化学习进行联合优化。在测试用例生成阶段,模型生成能够暴露程序缺陷的测试用例。在程序修复阶段,模型基于生成的测试用例和原始代码,生成修复补丁。这两个阶段通过强化学习奖励函数进行连接,奖励函数鼓励生成能够暴露缺陷的测试用例,并生成能够通过这些测试用例的修复补丁。

关键创新:Repair-R1最重要的创新在于其“先测试,后修复”的策略,以及将测试用例生成纳入模型训练流程的设计。与传统的先修复后测试的方法相比,Repair-R1能够使模型更好地理解缺陷的本质,从而生成更有效的修复补丁。此外,通过强化学习联合优化测试用例生成和程序修复,能够进一步提升修复效果。

关键设计:Repair-R1使用强化学习来共同优化测试用例生成和程序修复。奖励函数的设计至关重要,它需要鼓励模型生成能够暴露缺陷的测试用例,并生成能够通过这些测试用例的修复补丁。具体而言,奖励函数可以包括测试用例的覆盖率、测试用例的区分度(即能够区分正确和错误行为的能力)以及修复补丁的正确性等指标。此外,模型可以使用不同的骨干模型,例如Qwen3-4B等,并进行微调以适应特定的修复任务。

🖼️ 关键图片

fig_0
fig_1
fig_2

📊 实验亮点

实验结果表明,Repair-R1在四个广泛采用的基准测试上均取得了显著的提升。与原始模型相比,Repair-R1将修复成功率提高了2.68%至48.29%,测试生成成功率提高了16.38%至53.28%,测试覆盖率提高了0.78%至53.96%。这些结果表明,Repair-R1的“先测试,后修复”策略能够有效地提升自动化程序修复的效果。

🎯 应用场景

Repair-R1具有广泛的应用前景,可以应用于软件开发、测试和维护等多个领域。它可以帮助开发人员自动定位和修复程序中的缺陷,提高软件质量和开发效率。此外,Repair-R1还可以用于自动化测试,生成能够有效暴露程序缺陷的测试用例,从而提高测试的覆盖率和效率。未来,该技术有望应用于更复杂的软件系统和安全漏洞修复。

📄 摘要(原文)

APR (Automated Program Repair) aims to automatically locate program defects, generate patches and validate the repairs. Existing techniques for APR are often combined with LLMs (Large Language Models), which leverages the code-related knowledge of LLMs to improve repair effectiveness. Current LLM-based APR methods typically utilize test cases only during the inference stage, adopting an iterative approach that performs repair first and validates it through test execution afterward. This conventional paradigm neglects two important aspects: the potential contribution of test cases in the training phase, and the possibility of leveraging testing prior to repair. To address this, we propose Repair-R1, which introduces test cases into the model's training phase and shifts test generation to precede repair. The model is required to first generate discriminative test cases that can distinguish defective behaviors, and then perform repair based on these tests. This enables the model to better locate defects and understand the underlying causes of defects, thereby improving repair effectiveness. We implement Repair-R1 with three different backbone models, using RL (reinforcement learning) to co-optimize test generation and bug repair. Experimental results on four widely adopted benchmarks demonstrate the superiority of Repair-R1. Specially, compared to vanilla models, Repair-R1 improves repair success rate by 2.68\% to 48.29\%, test generation success rate by 16.38\% to 53.28\%, and test coverage by 0.78\% to 53.96\%. We publish the code and weights at https://github.com/Tomsawyerhu/APR-RL and https://huggingface.co/tomhu/Qwen3-4B-RL-5000-step.