[论文解读] SelfAPR: Self-supervised Program Repair with Test Execution Diagnostics
SelfAPR 提出了一种自监督程序修复框架,通过扰动目标程序的旧版本生成项目特定的训练样本,并将测试执行诊断信息整合到输入表示中以指导修复。该方法在 Defects4J 的漏洞上实现了 110 次修复,优于所有先前基于监督学习的方法,解决了领域特定知识和故障类型意识方面的差距。
Learning-based program repair has achieved good results in a recent series of papers. Yet, we observe that the related work fails to repair some bugs because of a lack of knowledge about 1) the application domain of the program being repaired, and 2) the fault type being repaired. In this paper, we solve both problems by changing the learning paradigm from supervised training to self-supervised training in an approach called SelfAPR. First, SelfAPR generates training samples on disk by perturbing a previous version of the program being repaired, enforcing the neural model to capture projectspecific knowledge. This is different from the previous work based on mined past commits. Second, SelfAPR executes all training samples and extracts and encodes test execution diagnostics into the input representation, steering the neural model to fix the kind of fault. This is different from the existing studies that only consider static source code as input. We implement SelfAPR and evaluate it in a systematic manner. We generate 1 039 873 training samples obtained by perturbing 17 open-source projects. We evaluate SelfAPR on 818 bugs from Defects4J, SelfAPR correctly repairs 110 of them, outperforming all the supervised learning repair approaches.
研究动机与目标
- 为解决监督神经程序修复中缺乏项目特定知识的问题,该问题限制了对领域特定标记的泛化能力。
- 克服训练数据中缺乏故障类型信息的问题,该问题阻碍了对特定漏洞类别(如 NullPointerExceptions)的修复。
- 开发一种自监督训练范式,生成无需依赖挖掘到的旧提交的合成项目感知训练样本。
- 将测试执行期间的运行时诊断信息集成到输入表示中,以指导模型修复特定故障类型。
- 在真实世界基准上评估自监督学习在程序修复中的有效性,特别是针对先前监督模型无法修复的漏洞。
提出的方法
- SelfAPR 通过系统性地扰动待修复程序的旧版本,生成 1,039,873 个训练样本,确保训练数据中包含项目特定的标记。
- 该框架执行所有生成的训练样本,以收集测试执行诊断信息,如运行时异常和断言失败,并将这些信息编码到输入表示中。
- 测试执行诊断作为额外的输入标记嵌入神经模型中,在修复预测过程中提供故障类型信号。
- 自监督训练循环通过使用扰动后的旧版本作为训练数据源,替代监督学习,避免对外部提交的依赖。
- 该模型采用编码器-解码器架构,其输入表示通过源代码和诊断信号的双重增强,以预测正确的补丁。
- 该方法利用 SentencePiece 分词技术,并在合成数据集上微调预训练模型,以提升对未见漏洞的泛化能力。
实验结果
研究问题
- RQ1基于项目特定扰动的自监督训练是否能超越基于挖掘提交的监督学习,在神经程序修复中实现更优效果?
- RQ2将测试执行诊断信息整合到输入表示中,是否能增强模型修复特定故障类型的能力?
- RQ3SelfAPR 是否能够修复现有监督神经修复模型因缺乏项目特定标记而无法修复的漏洞?
- RQ4SelfAPR 在标准基准上与最先进基于监督学习的修复工具相比表现如何?
- RQ5执行诊断信息的引入在多大程度上提升了修复准确率和故障类型泛化能力?
主要发现
- SelfAPR 在 Defects4J 基准的 818 个漏洞中成功修复了 110 个,优于所有先前基于监督学习的修复方法。
- 该模型修复了 110 个先前方法失败的漏洞,包括需要项目特定标记(如 requiresLevel.isOn())的漏洞,而这些标记在先前系统的训练数据中缺失。
- SelfAPR 通过使用测试执行诊断信息,能够识别并修复如 NullPointerExceptions 等故障类型,而这些类型常被仅依赖静态代码的模型所忽略。
- 自监督训练循环从 17 个开源项目中生成 1,039,873 个训练样本,确保丰富的项目特定知识被嵌入模型中。
- 通过将诊断信息编码到输入中,SelfAPR 能够引导模型聚焦于修复特定故障类别,从而提升修复精度和泛化能力。
- 该框架表明,结合执行反馈的自监督数据生成方法,在神经程序修复中比挖掘真实世界提交更具有效性。
更好的研究,从现在开始
从阅读论文到最终审阅,大幅缩短您的研究时间。
无需绑定信用卡
本解读由 AI 生成,并经人工编辑审核。