论文部分内容阅读
如今,软件在人们的社会生活中占据越来越重要的地位,软件的正确性也受到人们越来越多的重视。特别是随着敏捷开发、开源软件等快速迭代开发模式的出现,人们对软件的安全可信提出了更高的要求。据统计,软件测试及维护占50%~75%的软件开发成本。软件测试是保证软件安全的重要手段,它的主要任务是发现软件设计缺陷,进而要求开发人员分析并修复缺陷。 早期软件测试主要由人工完成,测试人员通过对软件功能的理解构建测试输入与期望输出。随后,自动化软件测试技术开始出现并不断发展。随着计算机计算能力的提高以及约束求解等技术的不断发展,基于符号执行技术的测试用例自动构造方法得到了广泛的重视和应用。然而符号执行技术的分析规模极大受困于路径爆炸问题。在测试阶段发现软件实现错误后,开发人员需要分析其产生的错误原因,进而正确的修复该错误。错误的缺陷修复不但无法修复已发现的错误,相反还会引起其它不可预期的缺陷甚至灾难。然而,目前的软件错误定位方法大多提供较少的信息帮助开发人员理解错误形成的原因,从而难以有效的指导开发人员正确修复发现的错误。 针对上述研究现状,本论文研究致力于研发有效的软件测试与错误定位方法。本论文首先提出一种基于最弱前置条件计算的分析框架,在此基础上提出一种基于符号执行技术的测试用例自动生成方法,该方法能有效的缓解符号执行技术面临的路径爆炸问题。随后,本论文基于该框架提出一种有效的错误定位方法,该方法可以提供有效信息帮助开发人员理解错误的形成原因。最后,本论文针对演化场景中出现的软件错误,提出一种全自动错误定位方法,该方法在自动定位错误相关的代码修改块时,还会提供有效的错误理解信息。 本论文的主要工作包括以下五部分: 1.基于程序执行路径的最弱前置条件计算框架。 本论文提出一种基于程序执行路径的最弱前置条件计算框架,其输入为一条具体的执行路径,它沿着该执行路径执行反向分析并计算最弱前置条件。本论文的后续研究会基于该框架提出有效的符号执行加速方法与错误定位方法。 2.基于最弱前置条件计算的符号执行加速方法。 基于大部分执行路径共享相同后缀执行路径的特性,本论文提出一种有效的符号执行加速算法以提高符号执行技术的分析规模。该方法通过裁剪公共后缀路径以减少重复分析冗余路径,缓解符号执行路径爆炸问题。在完成每条执行路径遍历后,该方法通过前置条件计算框架为每个分支执行点更新从该点出发的子路径集合摘要,并在后续路径遍历中使用当前摘要信息裁剪冗余的子路径。该方法在加速符号执行分析效率的同时,不会裁剪任何非冗余的执行路径。本论文基于最弱前置条件计算框架实现了该方法的原型工具,并在Linux应用程序上展开相关实验,实验表明该方法能安全而有效的裁剪实际程序中的冗余执行路径,提高了符号执行的分析效率。 3.基于最弱前置条件计算的级联式错误定位方法。 在错误修复阶段,为了给开发人员提供有效的错误理解信息,本论文提出了一种级联式错误定位方法。通过最弱前置条件计算及约束求解技术,该方法通过级联式分析方法计算导致错误发生的所有可能原因,并将其组织成帮助开发人员易于理解错误的原因树。为了提高分析效率,本论文还提出了一系列的优化策略,从而保证该方法的有效性。本论文基于最弱前置条件计算框架实现了该方法的原型工具,在大量实际程序上的实验结果表明该工具能提供有效的信息辅助开发人员理解错误形成原因。 4.基于最弱前置条件计算的演化软件错误定位方法。 对于演化中的软件,本论文提出一种语义分析与动态分析相协同的回归测试错误定位方法。该方法在语义分析阶段产生有效信息帮助开发人员理解错误形成原因,同时它会利用动态分析确定引起错误发生的代码修改块。该方法充分结合了语义分析和动态分析的优点,提高了错误定位的有效性与准确性。本论文基于最弱前置条件计算框架实现了此协同分析方法的原型工具,并在Linux应用程序的演化错误上展开分析,其实验结果表明该方法既能提供有效信息帮助开发人员理解错误原因,也能准确定位导致错误发生的程序代码修改块。 5.基于最弱前置条件计算的软件测试与错误定位实例。 为了系统说明本论文中提出的符号执行加速方法与错误定位方法的可用性以及有效性,本论文在一个实际含有错误的程序上相继展开软件测试与错误定位分析。实例分析结果表明,本论文提出的符号执行加速方法能快速生成覆盖非冗余路径的测试用例集,而错误定位方法能有效的分析错误发生原因,且能快速而准确的标识演化版本中引起错误的程序修改块集合。