论文部分内容阅读
缺陷作为软件系统设计和维护过程中不可避免的产物,随着软件系统的规模和复杂程度的增加也在不断增加。将软件缺陷的定位与修复工作进行自动化,对于提升软件调试效率以及软件质量有着重要意义。多年来学术界和工业界一直致力于高效的、准确的缺陷定位和自动修复技术的研究,取得了不少进展。然而由于软件缺陷作用机理的复杂性,目前的缺陷定位和自动修复技术仍然面临很大挑战。本文基于软件执行过程中错误的传播过程,对现有的缺陷定位技术以及基于缺陷定位的自动修复技术修复效果进行研究分析,并针对缺陷定位、补丁生成以及补丁验证三个方面,研究基于测试用例聚类的缺陷定位优化技术、基于可疑代码集过滤的程序自动修复技术以及基于测试用例分组的迭代修复技术,提出了一系列提高缺陷定位能力和自动修复能力的优化技术,并通过对大型开源软件真实历史错误进行缺陷定位和修复实验,依据科学统计和度量方法验证了这些优化技术的效能。论文的主要研究工作及创新点如下:1)从缺陷容忍和缺陷排除的角度出发,对现有的程序自动修复工具的修复效果进行分析在研究领域,缺陷容忍和缺陷排除是两类主流的提升软件可靠性和安全性的方式。现有的程序自动修复工具均专注于通过补丁生成的方式来修复目标程序暴露出来的故障,却忽略了对修复效果的分析研究。本文通过收集两种主流的软件自动修复工具:Genprog以及CETI所生成的修复补丁,分析各个修复补丁中所修改的代码与目标程序中的软件缺陷之间的关联性,研究现有修复工具的修复效果是倾向于实现缺陷容忍还是缺陷排除。此外,本文还提出了缺陷复杂程度和错误深度的概念,通过缺陷所涉及的代码数来简单表示缺陷的复杂程度,以及通过从缺陷到失效所经过的传播链的长度和缺陷所影响的错误传播链的数量来定义程序中所包含错误的深度,并分析统计了缺陷的复杂程度、错误深度与最终修复效果(生成补丁是属于缺陷容忍还是缺陷排除?)之间的关联程度。分析结果表明,现有程序自动化修复工具更多地是以缺陷容忍方式而不是缺陷排除方式来修复目标程序,缺陷的复杂程度越低、错误深度越小,就越可能通过缺陷排除的方式进行修复,反之,则只能通过缺陷容忍的方式进行修复。2)提出了基于测试用例聚类的缺陷定位技术优化方法基于程序谱的缺陷定位技术(SFL)是目前最为流行的一种缺陷定位技术,然而由于其是根据测试用例集来进行统计定位缺陷的,它的定位精度必然受到巧合正确性现象(coincidental correctness)的影响。巧合正确性是指在测试用例执行过程中,缺陷所在代码被执行,但缺陷并未被激活或错误的传播并未导致失效的情况,由于sfl是根据执行测试用例所覆盖的代码以及执行结果来统计得到各个程序代码为缺陷所在的可疑度,巧合正确的测试用例越多,其定位缺陷的精度就越受影响。本文通过对部分缺陷程序进行缺陷定位实验,观察到在巧合正确的测试用例之间,测试用例执行过程中的错误的传播链之间具有很高的相似性,基于这个观测结果,假设在执行所有巧合正确的测试用例时,其行为之间均具有很高的相似度,并提出了一种基于聚类分析的缺陷定位优化方法tsar(testcaseselectionandreconsitution),通过将测试用例进行聚类,并基于聚类来构建新的覆盖矩阵来进行缺陷定位的可疑度计算,从而尽可能地削弱巧合正确性现象对sfl的定位精度的影响。实验结果表明,在大部分情况下,通过tsar能有效提高sfl的定位精度。3)提出了基于可疑代码集过滤的程序自动修复技术优化方法目前,自动化的程序修复技术往往是通过修改一处或多处的代码来产生修复补丁,这些可进行修改的代码集合通常是通过缺陷定位技术来得到的,且被称为可疑代码集。然而,现有的可疑代码集中往往包含大量与成功修复无关的代码,这些代码影响了自动修复的效率。本文提出了一种过滤可疑代码集中无用代码的方法sfcsf(suspiciousfaultycodesnippetfiltering),在保证修复成功率的同时可以有效地减少可疑代码集的大小。sfcsf依托于基于程序谱的缺陷定位(sbfl)技术来获得各个代码的可疑值。基于错误的传播链,sfcsf只从可疑代码集中过滤出在错误传播链上那些可疑值即将发生变化的节点处代码作为过滤后的可疑代码集进行自动修复。实验结果表明了sfcsf在大多数情况下能够大大提高了自动修复工具的修复效率,但同时,sfcsf的有效性也受到了测试用例集的制约:程序谱过于相似的测试用例集将使得sfcsf失效。4)提出了基于测试用例分组的迭代修复技术在补丁验证阶段,自动化的程序修复技术往往使用测试用例集来验证所生成补丁的有效性:只有使得所有测试用例的执行结果均正确的补丁才是正确的修复补丁。这种验证方式表明现有的自动化的程序修复技术仍是基于缺陷排除的思想来生成并验证补丁的,而忽略了部分修复的可能性。而本文之前的研究表明,修复结果大部分是缺陷容忍的。自动修复技术的目标与结果之间的矛盾性使得修复的成功率和效率受到很大影响,特别是针对复杂缺陷,现有的自动修复技术的修复效果并不理想。本文从实现缺陷容忍的角度出发,提出了一种基于测试用例分组的迭代修复方法,该方法根据测试用例的代码执行信息将测试用例进行分组,并基于迭代的方式对程序进行修复:每次迭代的目标在于生成能够满足一组或多组测试用例的中间补丁,通过多次迭代,最终获得满足所有测试用例的修复补丁。实验结果显示,本文方法能够大大提高对程序缺陷特别是复杂缺陷的修复能力。