论文部分内容阅读
程序错误是在软件开发流程中难以避免的现象。当程序被检测到发生错误时,调试的过程实质上可以分为两个步骤:首先确定错误发生的位置和错误产生的原因,然后对其进行修复。第一步被称为“错误定位”,是软件开发过程中调试阶段代价消耗最高的活动之一。目前错误定位已有较多成熟的技术,存在的问题是即使检测到了错误的存在,对其的修复工作仍需开发者来完成,并且错误修复的难度与复杂程度远远高于错误定位,因此研究自动程序错误修复技术是一项具有重要意义的任务。结合变异技术与错误定位技术的自动程序修复方法,具有较好的程序错误修复能力,但这种方法不可避免的需要花费巨大的时间开销来执行变异体,尤其在应用于实际工业环境的大型程序时,其执行开销问题尤为严重。是否需要对程序生成所有可能的变异体以及从程序的何处开始产生变异体是这种方法面临的两个主要问题。应用错误定位技术,可以首先对怀疑度偏高的语句进行检查,以此避免较多无效变异体的产生,但在实际的应用中,错误定位并不足够精确,并且一些错误并不是发生在怀疑度较高的语句上,而是存在于与之有依赖关系的语句中,进而导致应用效果不理想。可以看出,这种使用贪心策略优先检查高怀疑度语句的思想并不能够高效的应对自动程序修复问题。寻找一个正确的变异体作为修复补丁可以被看作是持续寻找最优解的过程,因此应用全局最优方法可以有效提高寻找修复补丁的效率。此外,现有的修复策略大多面向单错误程序,而现实中程序的错误往往由多个位置引起。本文基于上述的问题,在采用错误定位优点的同时,针对贪心策略易陷入局部最优解的问题,提出了一种基于搜索的变异程序自动修复方法,不仅能够有效的解决变异体执行开销问题,同时对多错误程序具有一定的修复能力。为了应对全局最优搜索算法自身执行效率的缺陷,本文进一步提出了两种优化方法来缩小搜索空间和加速收敛速度,分别是搜索算法的非随机初始种群方法和混合式交叉策略。在搜索算法中,初始种群中的个体由怀疑度较高的语句构成,其怀疑度值由错误定位方法计算得到。这些个体具有较高的怀疑度值,被作为搜索初始的粗略解。在搜索过程中,通过混合式的交叉策略,采用固定位置的交叉方式来加速全局最优解的收敛,同时采用随机位置的交叉方式来加速对整个搜索空间的分布。为了进一步验证本文提出的自动程序修复方法的有效性、效率以及两种优化方法对搜索效率的影响,设计了一系列实验来研究和讨论相关问题。对西门子套件程序集的实验结果表明本文提出的基于搜索的变异程序自动修复方法相对于基于穷举的方法在寻找补丁时具有更高的效率并且能够保证修复能力,并且对于多错误版本程序具有一定的修复能力。同时非随机的初始种群方法和混合式交叉策略能够有效的缩小搜索空间,加速收敛。