论文部分内容阅读
作为智力密集型产品,软件开发过程中不可避免地会出现软件缺陷。为了定位、修复软件缺陷,维持系统正常运行,软件调试与维护活动几乎持续贯穿了软件的整个生命周期,但这付出了巨大的时间、人力成本。为此,研究人员开发出了各种程序自动化修复软件缺陷的原型工具,旨在通过计算机将缺陷定位、补丁生成和补丁验证过程自动化执行,从而降低维护成本。经过数十年的发展,开源软件在软件工程领域扮演着越来越重要的角色。源源不断新设立的开源软件项目以及持续迭代的软件版本历史为深入研究软件工程本质性规律提供了广泛的数据来源,也为相关基于开源软件的研究提供了丰富的知识储备。复用补丁的程序自动修复便是将程序自动修复和软件资源挖掘联系起来的典型例子。它通过挖掘开源软件社区广泛存在的补丁知识来指导程序自动修复工具产生正确的修复结果。但是,由于开源社区补丁存在冗余、不完整等噪音,这些噪音对修复结果是否产生影响成为本研究的主要问题。本文首先归纳分析了当前复用补丁的程序自动修复技术,主要分为两类:在补丁生成阶段复用补丁和补丁验证阶段复用补丁。然后,针对开源软件社区的冗余补丁噪音,实地考察其在多个项目中的存在情况,并采用剔除和添加随机冗余补丁两种策略考察修复工具在复用含冗余补丁时的修复结果。同时,针对开源社区的不完整补丁,通过拆分复杂补丁的方式来模拟。两种补丁噪音的实验结果表明:1)冗余补丁作为软件版本库的一种噪音在不同软件历史上均存在;2)冗余补丁对程序自动修复工具Prophet影响不显著。3)拆分的补丁块在一定程度上可以指导候选补丁排序,但也会降低Prophet工具修复效果。文章最后提出一种扩充补丁学习知识的方法,将复杂补丁知识通过拆分方式纳入到学习范畴,在同样的缺陷库上考察了扩充补丁学习知识后的修复结果并留下开放性问题,供后续研究者继续探究。