Less is More: Adaptive Program Repair with Bug Localization and Preference Learning

📄 arXiv: 2503.06510v1 📥 PDF

作者: Zhenlong Dai, Bingrui Chen, Zhuoluo Zhao, Xiu Tang, Sai Wu, Chang Yao, Zhipeng Gao, Jingyuan Chen

分类: cs.SE, cs.CL

发布日期: 2025-03-09

备注: accepted by AAAI2025 Oral


💡 一句话要点

提出AdaPatcher,通过自适应程序修复生成最小修改的补丁

🎯 匹配领域: 支柱二:RL算法与架构 (RL & Architecture)

关键词: 自动程序修复 自适应修复 错误定位 程序修改 偏好学习

📋 核心要点

  1. 现有APR方法侧重于生成正确补丁,忽略了修复后代码与原始代码的一致性,导致过度修改。
  2. AdaPatcher通过两阶段方法,先精确定位错误,再训练程序修改器,保证修复前后代码一致性。
  3. 实验表明,AdaPatcher显著优于现有基线方法,验证了其在自适应程序修复任务中的有效性。

📝 摘要(中文)

自动程序修复(APR)旨在为有缺陷的代码自动生成补丁。然而,大多数研究侧重于生成正确的补丁,而忽略了修复后的代码与原始错误代码之间的一致性。如何进行自适应的错误修复并生成修改最少的补丁很少被研究。为了弥合这一差距,我们首先引入了一个新的任务,即AdaPR(自适应程序修复)。然后,我们提出了一种两阶段方法AdaPatcher(自适应补丁生成器),以增强程序修复,同时保持一致性。在第一阶段,我们利用具有自调试学习的错误定位器来精确定位错误位置。在第二阶段,我们训练一个程序修改器,以确保修改后的修复代码与修改前的错误代码之间的一致性。程序修改器通过位置感知的修复学习策略来生成基于已识别的错误行的补丁,采用选择性参考的混合训练策略,以及自适应偏好学习来优先考虑更少的更改。实验结果表明,我们的方法大大优于一系列基线,验证了我们的两阶段框架对于新提出的AdaPR任务的有效性。

🔬 方法详解

问题定义:现有自动程序修复方法主要关注生成功能正确的补丁,而忽略了修复后的代码与原始错误代码之间的一致性。这种不一致性可能导致过度修改,使得修复后的代码难以理解和维护。因此,需要一种方法能够在修复错误的同时,尽可能地减少对原始代码的修改。

核心思路:AdaPatcher的核心思路是将程序修复过程分解为两个阶段:首先精确定位错误的位置,然后基于错误位置生成最小修改的补丁。通过这种方式,可以确保修复后的代码既能解决错误,又能与原始代码保持最大程度的一致性。

技术框架:AdaPatcher是一个两阶段的框架。第一阶段是Bug Locator,使用自调试学习来精确定位错误代码行。第二阶段是Program Modifier,它基于第一阶段定位的错误行生成补丁。Program Modifier使用位置感知的修复学习策略,混合训练策略和自适应偏好学习来生成修改最少的补丁。

关键创新:AdaPatcher的关键创新在于其自适应性,即能够根据错误的位置和上下文,生成最小修改的补丁。这通过以下几个方面实现:(1) 使用自调试学习的Bug Locator,提高错误定位的准确性;(2) Program Modifier采用位置感知的修复学习策略,针对特定错误行生成补丁;(3) 采用自适应偏好学习,优先选择修改较少的补丁。

关键设计:Bug Locator使用自调试学习,通过对比修复前后的程序行为来学习错误定位模型。Program Modifier使用位置感知的修复学习策略,将错误位置作为输入,指导补丁生成。混合训练策略结合了参考补丁和生成的补丁,提高模型的泛化能力。自适应偏好学习通过奖励修改较少的补丁,惩罚修改较多的补丁,引导模型生成最小修改的补丁。具体的损失函数和网络结构细节在论文中未明确说明,属于未知信息。

🖼️ 关键图片

fig_0
fig_1
fig_2

📊 实验亮点

AdaPatcher在实验中显著优于一系列基线方法,验证了其有效性。具体性能数据和提升幅度在摘要中未给出,属于未知信息。但结论明确指出,该方法在自适应程序修复任务上表现出色,证明了两阶段框架的有效性。

🎯 应用场景

AdaPatcher可应用于软件开发和维护的各个阶段,例如自动化测试、持续集成和代码审查。它可以帮助开发人员快速修复错误,减少手动调试的工作量,并提高代码质量和可维护性。此外,该方法还可以用于教育领域,帮助学生学习程序调试和修复技术。

📄 摘要(原文)

Automated Program Repair (APR) is a task to automatically generate patches for the buggy code. However, most research focuses on generating correct patches while ignoring the consistency between the fixed code and the original buggy code. How to conduct adaptive bug fixing and generate patches with minimal modifications have seldom been investigated. To bridge this gap, we first introduce a novel task, namely AdaPR (Adaptive Program Repair). We then propose a two-stage approach AdaPatcher (Adaptive Patch Generator) to enhance program repair while maintaining the consistency. In the first stage, we utilize a Bug Locator with self-debug learning to accurately pinpoint bug locations. In the second stage, we train a Program Modifier to ensure consistency between the post-modified fixed code and the pre-modified buggy code. The Program Modifier is enhanced with a location-aware repair learning strategy to generate patches based on identified buggy lines, a hybrid training strategy for selective reference and an adaptive preference learning to prioritize fewer changes. The experimental results show that our approach outperforms a set of baselines by a large margin, validating the effectiveness of our two-stage framework for the newly proposed AdaPR task.