论文部分内容阅读
软件缺陷会降低系统的可靠性、可用性和安全性。开发人员发现软件失效后,通常需要观察程序的执行状态,查找失效的根源并消除软件缺陷。然而由于程序状态空间规模巨大,并且错误的程序状态会沿着执行路径传播。这使理解“什么导致了程序失效?”以及“为什么程序会失效?”成为值得研究的问题,亟需自动化的软件故障定位技术来提供这些信息,辅助软件调试。程序设计教育领域也需要软件故障定位技术的支持,为学生在线学习编程提供及时的调试反馈和辅助。不同于软件开发,学生程序特别是初学者的程序中经常含有概念错误,错误密度大、缺陷种类多样,甚至缺少关键语句,可能对所有的测试用例都执行失效。“缺陷程序存在部分成功执行”的假设,不完全适用于学生程序调试,需要结合学生程序设计自身特点研究故障定位方法。本文提出了“失效-故障定位-理解”模型,分析了软件故障定位领域的关键科学问题,并针对软件开发和学生程序调试的不同特点,分别研究这两类场景下的故障定位技术。首先围绕“存在部分成功测试用例的情况下,有效地报告缺陷位置,为开发人员理解和修复缺陷提供充分的信息。”这一目标,研究测试用例优选方法和基于程序不变量的故障定位方法。然后,围绕“存在充分示例程序的情况下,即使缺陷程序不能通过任何测试用例,也可以有效定位其中的可疑语句。”的目标,研究学生程序的故障定位方法。主要研究内容分为以下四个部分。(1)为了“最大化地利用测试信息,选择适合于故障定位的测试用例集合”,提出了面向有效故障定位的测试用例优选方法。首先,提出“失效覆盖向量相似度优先排序”准则,将执行路径与失效执行路径相似的成功测试用例赋予较高的优先级;然后提出“失效覆盖等价划分优化选择”准则,选择能够最大区分失效执行语句的成功测试用例子集合;在此基础上,建立测试用例优选模型。实验结果表明,在约简率和故障定位有效性两个指标方面,本方法均优于已有基于语句和基于向量的测试用例约简方法。(2)针对已有方法对不变量定义不完善导致可定位的缺陷种类有限、因缺少对测试用例的影响分析导致不变量违背检测的漏检等问题,提出了基于程序不变量分析多种缺陷类型的故障定位方法。首先,在浮点型范围不变量的基础上,扩展了集合型不变量和真值表型不变量,还识别了仅被失效覆盖的语句和永真/永假条件谓词这两类难于用不变量违背定位的可疑语句。然后,将测试用例优选与程序不变量故障定位相结合,以降低不变量违背检测漏检。实验结果表明,与已有基于程序不变量的故障定位方法相比,本方法可以有效定位更多种类的缺陷。(3)针对已有方法缺少对失效状态传播的分析,导致不变量违背检测的漏检和误检,难于准确定位到失效的产生根源等问题,提出了基于程序不变量解析失效状态传播的故障定位方法。一方面,利用变量到达定值分析,定位常量赋值缺陷,降低漏检。另一方面,利用依赖分析过滤掉因失效状态传播导致的不变量违背检测误检。实验结果表明,本方法能有效降低不变量故障定位的误检和漏检,且与程序谱方法相比更有效。(4)针对学生程序可能对所有测试用例都失效,但存在大量可供参考的示例程序等特点,研究基于示例的故障定位方法。首先,提出基于结构度量和执行值序列的程序聚类方法,从大量已有程序中识别示例程序。然后,提出解析失效状态传播上下文的故障定位方法,通过识别缺陷程序和示例程序的执行状态和结构语义差异,定位可疑语句。实验结果表明,在有充足示例程序的情况下,该方法可以有效定位可疑语句,并为修复缺陷提供辅助。