摘要:自动化程序修复(APR)在减少错误修正的工作量方面具有巨大潜力,并且近年来提出了许多方法。 APR 通常被视为一种搜索问题,它的搜索空间包含所有可能的补丁,它的目标是在该空间中识别正确的补丁。许多技术采用数据驱动的方法,分析数据源(例如现有补丁和相似的源代码)以帮助识别正确的补丁。但是,尽管现有的补丁和相似的代码提供了补充信息,现有技术也仅能分析单个数据来源,无法轻松地扩展以同时对两者进行分析。在本文中,我们提出了一种新颖的利用现有的补丁和相似的代码的自动程序修复方法。我们的方法从现有补丁中挖掘出抽象的搜索空间,并通过与相似的代码片段进行区分来获得具体的搜索空间。然后,我们在两个搜索空间的交集内搜索。我们已将我们的方法实现为名为 SimFix 的工具,并在 Defects4J 基准测试中对其进行了评估。我们的工具成功修复了 34 个错误。据我们所知,这是 Defects4J 基准上由单一技术修复的最多错误。此外,据我们所知,我们的方法修复的 13 个错误从未被先前的方法修复。
关键词:自动程序修复,代码差异,代码适配
1、引言
自动化程序修复(APR)旨在通过自动生成满足规范的补丁来减少错误修复的工作量,这是迈向软件自动化的一步。近年来,已经提出了许多自动程序修复技术。典型的 APR 方法将有错误的程序和一组测试用例作为输入(程序至少使其中一个测试用例失败),并生成修复程序以修复故障(已修补的程序能通过所有测试)。
APR 通常被视为一种搜索程序,其搜索空间由所有可能的补丁组成,搜索目标是从空间中识别出正确的补丁。这个问题非常具有挑战性,因为搜索空间通常很大,并且包含很多合理但错误的补丁。测试用例无法区分正确的补丁和合理但不正确的补丁。APR 方法不仅需要在巨大的空间中找到正确的补丁,而且还需要避免看似合理但不正确的补丁。
为了解决此问题,许多 APR 技术采用数据驱动的方法来估计补丁的可能性,将搜索限制在更优先的搜索空间,以便首先尝试更有可能正确的补丁。常用的数据源之一是现有的补丁。分析现有补丁可以使我们得到错误修复的分布,因此我们可以选择进行修改可能性最大的补丁。典型的方法包括基于修复模式限制搜索空间的 PAR,Genesis,QAFix 和 SOFix,以及根据学习模型对补丁进行排序的 Prophet 和 HDRepair。另一个常用的数据源是源代码。分析源代码有助于我们了解要修复的程序的内部结构(包括公共代码和特定于上下文的代码),因此我们可以选择适合当前代码上下文的