关键词:
软件测试
测试覆盖准则
控制流覆盖
符号执行
缓存区溢出
摘要:
软件测试是软件质量保障的重要途径,在工业界得到广泛应用。但是由于穷尽测试的成本极高,因此现实中度量测试的充分程度成为软件测试领域一个重要问题。基于控制流的软件测试覆盖准则正是在此基础上被提出,通过度量测试过程中不同事件的发生情况来理解程序的行为并判断测试的充分程度。传统的控制流覆盖准则,如语句覆盖、分支覆盖,相对易于理解和实现,因此应用较为广泛。但是,由于语句和分支所包含的信息较少,这些覆盖准则不能很好的展示程序的行为;而路径覆盖准则能够以较细的粒度来捕获程序的行为,但是由于程序中路径爆炸、路径不可达等问题的存在,实现这一准则的成本很高,难以广泛使用。因此,现有的各种基于控制流的测试覆盖准则不仅形式上存在差异,而且从分支覆盖到路径覆盖之间存在巨大的复杂度和成本鸿沟,难以形成连续、统一的测试覆盖谱系,使得工业界难以细粒度地控制和判断测试投入。另一方面,在选定覆盖准则以后,如何有效地生成测试用例是软件测试需要解决的又一重要问题。符号执行技术通过探索遍历程序路径空间自动地生成测试用例,但是由于程序路径空间十分庞大,需要有效的方法和技术制导符号执行以提高测试用例生成效率、降低成本。本文围绕建立统一的软件测试控制流覆盖准则体系及其上的符号执行制导技术展开研究工作,具体包括以下几个方面:1.提出一种统一的软件测试控制流覆盖准则体系-Length-n Subpath Cover-age Criterion (LSC(n))。通过衡量程序中的Length-n Subpath,即连续n个分支组成的子路径的覆盖情况来灵活地获取从分支覆盖到路径覆盖之间的程序频谱,为工业界细粒度、连续地控制和判断测试投入提供支持。2.基于LSC(n),提出了面向程序中罕至部分的符号执行制导策略。根据已探索部分的LSC(n)频率,选取执行频率最低的Length-n Subpath对应的执行进行进一步的探索,并在符号执行引擎KLEE上实现了对应的制导策略。实验表明,该方法可以有效地指导符号执行快速的对程序整体进行覆盖、发现程序中的错误。3.基于LSC(n),提出了面向程序中重点区域的符号执行制导策略。针对测试人员需要对程序中的某些部分进行重点的测试和检查这一应用场景,结合符号执行过程中已探索部分的LSC(n)频率及对重点部分的覆盖情况为每个Length-n Subpath设置了一个权值,并选择权值最高的Length-n Subpath对应的执行进行进一步的探索;基于以上方法,在符号执行引擎KLEE上实现了对应的制导策略,实验表明,该方法可以更好地在重点部分进行探索,并产生相应的测试用例。4.基于LSC(n),提出了面向程序中特定目标组的符号执行制导策略。相对于对程序进行全面或局部的探索,指导符号执行针对特定目标组(如关键语句或操作)能够更加有效的减少探索的路径空间。针对用户给定的特定目标语句组,计算出能覆盖该语句组的所有Length-n Subpath集合,指导符号执行在探索过程中枝剪不属于该集合的Length-n Subpath对应的执行,使符号执行仅关注覆盖目标语句组的路径。在此基础上,以静态分析技术给出的缺陷警报信息为目标组实例,结合缓存区溢出这一特定问题实现了缓存区溢出缺陷警报审查和修复工具,实验表明,针对缺陷警报信息进行探索可以有效的提高搜索效率,同时能根据符号执行过程中的信息分辨缺陷的真实性。