论文部分内容阅读
随着现代软件产业规模的逐渐增大,程序修复已经成为软件开发和维护过程中消耗资源最多的活动之一。自动化程序修复技术旨在利用计算机高效的处理能力代替传统程序修复活动中繁重的人工劳动。因其美好的实现愿景,自动化程序修复技术自诞生以来受到了学术界和工业界的广泛关注。经过近10年的发展,虽然自动化程序修复领域涌现出了很多优秀的技术方法,如Gen Prog、AE等技术均在其验证实验中表现出了很好的修复效果,但目前仍缺少对自动化程序修复全面的实证研究,不同的目标程序规模、测试用例和修复技术等因素如何影响修复效果仍不明确。因此,本文基于5种主要的修复技术,对其在25种不同的测试用例组合条件下修复180个不同的程序错误的过程开展大规模的实证研究,根据实验数据来探索修复过程中的各项因素如何影响最终的修复效果,并进一步分析现有修复技术存在的缺陷。实验数据显示,现有自动化程序修复技术在修复较大规模程序的错误时易出现成功率和效率大幅度下降的问题,这主要有两方面原因:一是候选补丁的搜索空间过大,修复技术难以搜索到正确补丁;二是程序错误过于复杂,修复技术无法生成正确补丁。以这两方面缺陷为切入点,本文分别提出了基于变异分析的迭代程序修复技术和架构导向的多点程序修复技术,旨在提升现有技术对较大规模程序的修复效果。本文的主要成果包括如下三个方面:(1)本文通过广泛的实证研究,分析了目标程序、测试用例和自动化程序修复技术等因素对修复效果的影响,并进一步总结现有技术存在的缺陷。实验结果显示,现有自动化程序修复技术针对小规模故障程序修复时效果较好,但应用到大规模程序时,实验中的修复技术均出现了成功率和执行效率大幅度下降的问题。在针对大规模故障程序的修复过程中,现有技术暴露出了搜索空间剧增导致难以找到正确补丁,以及补丁生成规则过于简单导致无法生成正确补丁的问题。实验选取的5种自动化程序修复技术中,Brute-force在小规模程序上修复效果最好;而在较大规模故障程序上,修复效率相对最高的是Kali,修复成功率相对最高的是AE。Gen Prog因其候选补丁可能包含多个修改操作,可以用于修复一些其他技术难以修复的程序错误。RSRepair的修复效率仅次于Kali,但其修复成功率在5种修复技术中最低。研究测试用例数量的影响时,我们发现增加正确测试用例的数量,虽然可以减少过度拟合补丁的生成数量,但并不能帮助修复技术发现更多的成功修复补丁;而增加失败测试用例的数量,既可以减少过度拟合补丁的生成数量,也可以在一定程度上提高成功修复补丁的生成数量。最后,本文还分析了这5种自动化程序修复技术生成的正确补丁的分布,发现除RSRepair以外,其余4种修复技术均能够在前50%的搜索空间内找到80%的正确补丁。(2)为解决由候选补丁的搜索空间过大所导致的修复成功率较低的问题,本文提出一种基于变异分析的迭代程序修复技术,将修复过程划分为初始修复、基于变异分析的错误定位和迭代修复三个阶段。该技术在初始修复阶段使用一种效率较高的修复技术,若其没能找到正确补丁,则在错误定位阶段将候选补丁视为变异分析中的变异体,根据初始修复的补丁验证信息重新定位可疑语句,并将定位结果用于迭代修复。迭代修复阶段使用一种成功率较高的修复技术,受益于更精确的错误定位结果,其搜索空间内的候选补丁排序得到了优化;同时,迭代修复技术使用语义等价性检测方法,在迭代修复的搜索空间内消除了初始修复阶段已验证过的及其语义等价的失败候选补丁,大幅度减少了迭代修复搜索空间内候选补丁的数量。两方面措施共同应用,使得迭代的修复过程的搜索空间得到了优化。实验结果显示,基于变异分析的迭代程序修复技术能够有效提升修复成功率,其真实成功率为15%,而AE与Kali的真实成功率分别为10%和7%;本文还进一步分析了两种定位技术的适用场景,发现变异分析过程中存在测试用例正确执行的现象时使用迭代修复(MUSE)技术效果更好,反之则使用迭代修复(Metallaxis)技术更好。(3)为解决由候选补丁的修复能力不足所导致的修复成功率较低的问题,本文提出一种架构导向的多点程序修复技术。该技术利用基于变异分析的错误定位方法和基于程序目录的架构设计规则空间提取方法来获得可疑语句集在架构层面的隐形联系,用于定位多个修复点,并融合来源于多个修复点的修改操作来生成修复能力更强的候选补丁。实验结果显示,架构导向的多点程序修复技术相比于Kali和AE技术具有更高的修复成功率,且能够针对Wireshark-37190-37191中复杂的真实程序错误生成成功修复补丁;由于错误定位阶段的变异分析过程时间消耗较大,补丁生成阶段的补丁数量也较多,导致多点程序修复的效率偏低。本文通过对自动化程序修复的实证研究,综合分析了修复过程中各个因素对修复效果的影响,并进一步总结了现有技术在修复较大规模程序时存在的缺陷,为自动化程序修复技术的改进提供了重要的数据支撑。本文针对现有技术修复大规模程序时搜索不到正确补丁和无法生成正确补丁这两个普遍存在的问题,分别提出了两种改进的修复技术,虽然两种技术因为变异分析本身的高消耗导致整体执行效率偏低,但实验结果显示两种技术均能够有效提升修复成功率,在一定程度上缓解这两方面问题。