关键词:
自动程序修复
错误定位
修复模式
补丁
冗余
程序错误
摘要:
随着软件产品在我们的生活中有着越来越广泛的应用,程序的规模也急剧地上升,软件错误的产生可能会导致可怕的后果,而程序修复工作消耗了大量的资源。所以,自动化程序修复不仅可以降低程序开发人员的时间开销,还可以减少浪费在程序调试上面的时间。但是,真实世界的程序规模较大,当前修复方法对其支持效果不是很好,错误的修复率较低。程序补丁中的修复成分常常来源于被修复的程序自身,并且很多人工补丁的大体模式比较类似,存在复用的可能,因此本文也从开源代码仓库中挖掘可复用的修复模式,充分利用补丁成分的多源性,以期望对真实程序的修复。针对真实世界中的Java程序修复问题,本文研究了基于多源补丁的Java程序自动修复方法,具体的工作如下:首先,本文研究了基于程序自身冗余的修复方法j Genprog,针对其遗传操作生成补丁的语法合理性问题以及其修复点选择时的盲目性问题而在遗传操作时加入词法分析部分并使用可疑度加权的方法选择修复点加以改进,在Defects4j数据集上针对修复数量及时间上对比。结果表明本文方法在本文的参数设置上虽不能够产生更多的correct补丁,但在修复时间上本文方法相对于j Genprog方法提高了0.6min和1.1min,在plausible补丁的生成数量上均提高2个。然后,为了引入外部的修复模式来指导程序的修复工作,本文开展了修复模式的提取工作。本文从Git Hub中的44个开源项目的260392个commit中挖掘了75927个错误文件与修复文件对,利用Gum Tree代码差异分析方法以及代码上下文信息生成编辑脚本,对编辑脚本进行聚簇与过滤得到初筛的148个修复模式。再使用已有的研究与初筛后的修复模式一同人工归纳总结得出了10大类的错误修复模式。最后,将这10类修复模式加入到本文基于修复模式的方法构建中,并针对现有错误定位方法可疑列表排序不准确的问题提出一种可疑度列表的随机方法对错误定位加以改进,在真实条件与理想条件下分别进行针对Defects4j数据集的实验,发现分别可以完全正确修复19个错误与46个错误,与未使用修复模式相比分别提高了18个与45个。对于理想状态下的修复,研究了本文的10类修复模式修复的绝对性能,以及错误定位方法对于本文方法的影响。而使用本文的随机方法将真实状态下的完全正确的修复结果提高至25个,并研究了此随机方法的有效性与存在的问题,并与基于深度学习的方法进行对比分析得出了两类方法在修复能力上具有互补性的结论。