Automated Program Repair (APR) improves software reliability by generating patches for a buggy program automatically. Recent APR techniques leverage deep learning (DL) to build models to learn to generate patches from existing patches and code corpora. While promising, DL-based APR techniques suffer from the abundant syntactically or semantically incorrect patches in the patch space. These patches often disobey the syntactic and semantic domain knowledge of source code and thus cannot be the correct patches to fix a bug. We propose a DL-based APR approach KNOD, which incorporates domain knowledge to guide patch generation in a direct and comprehensive way. KNOD has two major novelties, including (1) a novel three-stage tree decoder, which directly generates Abstract Syntax Trees of patched code according to the inherent tree structure, and (2) a novel domain-rule distillation, which leverages syntactic and semantic rules and teacher-student distributions to explicitly inject the domain knowledge into the decoding procedure during both the training and inference phases. We evaluate KNOD on three widely-used benchmarks. KNOD fixes 72 bugs on the Defects4J v1.2, 25 bugs on the QuixBugs, and 50 bugs on the additional Defects4J v2.0 benchmarks, outperforming all existing APR tools.
翻译:自动程序修复技术通过自动生成补丁来提升软件可靠性。近期基于深度学习的程序修复方法利用深度学习构建模型,从现有补丁和代码语料库学习生成补丁。尽管具有前景,但这类方法在补丁空间中存在大量语法或语义错误的补丁。这些补丁往往违背源代码的语法和语义领域知识,因此无法成为修复缺陷的正确补丁。我们提出基于深度学习的程序修复方法KNOD,以直接且全面的方式融合领域知识引导补丁生成。KNOD包含两大创新:(1)新型三阶段树解码器,根据固有树结构直接生成补丁代码的抽象语法树;(2)新型领域规则蒸馏技术,利用语法语义规则和师生分布,在训练与推理阶段将领域知识显式注入解码过程。我们在三个广泛使用的基准数据集上评估KNOD:在Defects4J v1.2修复72个缺陷、QuixBugs修复25个缺陷、扩展Defects4J v2.0修复50个缺陷,性能超越现有所有程序修复工具。