论文部分内容阅读
软件错误自动修复是推进软件维护自动化,提高软件质量和可信性的重要手段。尽管人们已经提出了多种支持软件自动修复的方法和技术,然而现有研究表明,当前自动修复技术在修复能力及效率方面仍具有局限性。本文一体化研究软件错误自动修复体系,针对错误定位、补丁生成以及补丁验证三个阶段,研究面向自动修复的错误定位方法、基于随机搜索的补丁生成算法、以及补丁有效性验证性能优化技术。基于上述研究,提出了一系列提高软件修复能力和修复效率的优化技术,通过大型开源软件真实历史错误进行修复试验,依据科学统计和度量方法验证了这些优化技术的效能。论文的主要研究工作及创新点如下:1)从自动修复的角度研究错误定位技术,并建立了相应的错误定位技术评估体系作为软件自动修复技术的前端,错误定位技术用于定位引起软件失效的可疑代码位置,位置信息的准确性直接影响软件自动修复的效果。但是,目前的错误定位技术是基于开发人员开发的,本文通过实验表明,基于开发人员角度具有较好定位效果的定位技术并没有更好地辅助自动修复过程;另外,虽然错误定位技术的研究已超过30年,但是目前大部分开发人员在调试程序中并没有习惯于使用错误定位技术,而是仍继续沿用传统的调试技术,例如断点调试,使得错误定位技术的应用价值受到了质疑。而软件自动修复技术的兴起,则为错误定位技术提供了实际的应用平台。在此背景下,本文提出从自动修复角度开发错误定位技术,并建立了相应的错误定位技术评估体系。根据该评估体系,本文通过实验评估了当前流行的多种错位定位技术基于自动修复角度的定位精度,并根据实验结果提出了未来从自动修复角度开发错误定位技术的发展方向。2)构造基于随机搜索的软件自动修复方法本文使用最简单的随机搜索算法实现了一种软件自动修复方法。作为目前自动修复领域的奠定性成果之一,Gen Prog主要的贡献有两点:高效的变异(修复)规则和利用遗传编程思想指导补丁进化。虽然通过实验,Gen Prog展示出其非常出色的修复效果,但是目前的研究并未回答Gen Prog的修复效果是得益于其高效的变异规则,还是得益于其使用的遗传编程算法的高效指导能力。本文通过使用与Gen Prog相同的变异规则,利用随机算法而不是相对更智能的遗传编程算法,实现了基于随机搜索的软件自动修复原型工具。实验表明,Gen Prog所使用的遗传编程算法并没有比纯随机算法更好地指导补丁进化过程。论文分析了导致遗传算法失效的根本原因,并据此提出,在基于搜索的软件工程领域,针对每一种新的优化算法的应用,需要通过与纯随机算法进行对比以检验该优化算法的有效性。3)提出弱重编译技术针对补丁验证阶段重编译过程中存在的编译冗余现象,本文提出弱重编译技术以减少传统重编译过程中的编译冗余,降低重编译时间,进而提高修复效率。在重编译过程中,弱重编译技术仅仅重新编译由于补丁更新而被修改的代码部分,并没有重新生成或修改原始可执行程序;借助动态链接和插装工具,弱重编译实现了候选补丁的运行时动态更新。实验表明,相对于传统的重编译技术,论文提出的弱编译技术能大大降低重编译时间开销,提高软件修复效率。4)提出一种基于错误记录的测试用例排序技术针对补丁验证阶段回归测试过程中的测试用例执行,本文提出一种基于错误记录的测试用例排序技术(FRTP)。不同于传统的测试用例排序技术在排序前经常需要大量的计算资源用以收集关于测试用例集的相关执行信息,FRTP在软件自动修复启动之前并不需要收集任何排序信息,而是在修复过程中迭代地提取关于测试用例的无效补丁识别信息,并根据提取的信息动态地调整后续的测试用例执行顺序。由于从修复过程中提取信息需要的计算资源非常少几乎可以忽略,FRTP具有非常高的排序效率。实验证明,FRTP技术能有效地减少补丁验证所需测试用例执行数,提高软件修复效率。