论文部分内容阅读
近些年来,随着计算机技术的飞速发展,人们对软件系统的需求与日俱增,且软件的规模也在不断扩大。而使用存在软件缺陷的软件不仅会增加软件维护费用,而且可能会造成灾难性的后果。软件测试作为在程序开发阶段对程序进行功能验证的过程,是保证软件质量的重要手段。如何尽可能早的发现并修复软件缺陷已成为软件开发人员、软件测试人员及软件测试研究人员共同关注的焦点。代码静态分析技术作为一种兴起的软件测试技术,无需执行程序,可以基于程序片段进行分析,是构建可信软件的有效手段。然而,根据Rice定理,代码静态分析的结果不可能既是完备的又是可靠的,进而导致其分析的结果中可能存在大量的误报。误报的确认不仅需要花费大量的时间、人力和物力,而且会导致测试人员拒绝使用静态分析工具进行软件测试。如何提高代码静态分析结果(疑似故障)的确认效率,成为了软件测试领域研究的热点之一。本文的研究工作受到国家自然科学基金项目“源代码漏洞分析、检测与验证技术研究(U1736110)”的支持,并基于静态缺陷检测工具DTS(Defect Testing System)而展开。在代码疑似故障自动确认方面,本文主要做了以下三个方面的工作:1、误报消除技术的研究。基于路径敏感和需求驱动分析,本文提出了一种新的误报消除方法。该方法首先根据疑似故障缺陷特征在局部程序中(疑似故障函数内)计算缺陷特征的关联函数,并在后向分析时仅对这些关联函数进行详细分析。这样不仅保证了程序分析的精度,进而可以识别在静态分析时使用函数摘要代替被调函数导致精度损失而产生的误报,而且相对于详细分析所有被调用函数而言,仅详细分析关联函数可以提高分析的速度。然后,采用“整体-分段-整体”策略生成从故障函数入口到疑似故障语句的路径,此策略将关联函数内的路径作为整体路径的片段,通过分析关联函数内的不可达路径,可以阻止其不可达路径到整体路径的传递,减少了整体路径的生成数量。最后,提取每条路径的约束条件,并将其与疑似故障触发条件相结合来计算该路径能否触发疑似故障,进而判断该疑似故障是否为误报。为了验证所提方法的有效性,本文在5个开源C程序上对该方法进行了实验验证。实验结果表明,本文所提出的方法能够准确地消除静态分析结果中的部分误报,且在时间开销及误报消除数量方面,均优于函数内联方法。2、函数间不可达路径检测的研究。程序中的不可达路径在软件测试时不仅会对测试用例的生成及代码覆盖率测试产生影响,也会对疑似故障自动确认的效率及准确性产生影响。本文提出了一种基于不可满足约束模型的函数间不可达路径检测方法。该方法首先通过挖掘12695条不可达路径的共同约束特征,提取得到了 9种不可满足的路径约束模型。然后,针对被测路径,对其路径约束条件进行提取、聚类和简化,进而得到简化的约束条件集合。最后,通过将简化的约束条件集合与不可满足约束模型进行匹配来检测函数间的不可达路径。本文以在开源程序中随机选择的路径为基准路径对方法的有效性进行了实验验证。实验结果表明,本文提出的方法能够准确地检测出给定路径集合中89.6%的函数间不可达路径,且与代码模式方法相比,该方法所检测出的函数间不可达路径数量较多且时间开销较小。3、疑似故障触发路径生成的研究。在代码疑似故障自动确认的过程中,生成一条可以触发疑似故障的路径不仅可以对疑似故障进行确认,而且还可以协助软件开发人员修复故障。基于对疑似故障的需求驱动分析和函数间数据流分析,本文提出了一种疑似故障触发路径的生成方法。该方法首先根据疑似故障的缺陷特征计算其影响谓词,并对影响谓词所在函数的控制流图进行简化,进而减少后向遍历生成路径的数量,减轻了路径爆炸的风险,从而减少生成触发路径的时间。然后,采用“section-whole”策略后向遍历简化的函数CFG生成疑似故障的触发路径。该策略将整个路径生成看作是路径片段的组合,在每个路径片段生成时判定其可达性,这样可以阻止函数内的不可达路径在函数间路径的传递,进而减少对路径可达性判定次数,从而提高触发路径生成的效率。本文以开源程序中的真实故障和非真实故障为基准故障对该方法进行了实验验证。实验结果表明,本文提出的方法可以为64%的真实故障生成触发路径,且与传统方法相比,该方法在触发路径生成数量及效率方面均优于传统方法。