
摘要
我们研究从诊断反馈(例如编译器错误信息)中学习程序修复的问题。程序修复面临两大挑战:其一,需要在源代码与诊断反馈之间进行符号的推理与追踪;其二,可用于程序修复的标注数据集规模相对较小。针对这两个挑战,本文提出两项创新解决方案。首先,我们引入一种程序-反馈图(program-feedback graph),将源代码与诊断反馈中与程序修复相关的符号进行关联建模,并在此基础上应用图神经网络(Graph Neural Network)来模拟修复过程中的推理机制。其次,我们提出一种自监督学习范式,利用网络上大量未标注的程序,生成海量额外的程序修复样本,用于预训练我们的模型。我们在两个应用场景中评估了所提出的方法:一是修复初学者编程作业(基于DeepFix数据集),二是修复程序合成系统的输出结果(基于SPoC数据集)。实验结果表明,我们提出的最终系统DrRepair显著优于现有方法,在DeepFix数据集上实现了68.2%的完整修复率(较之前最佳结果提升22.9%),在SPoC数据集上达到48.4%的合成成功率(较之前最佳结果提升3.7%)。