论文部分内容阅读
随着“互联网+”概念的提出,计算机相关技术的应用逐渐与传统的行业结合在一起,为其在现代化的发展道路上创造了新的契机。然而在发展的过程中,传统行业的进步也对计算机技术的更新提出了新的需求。其中,计算机软件的质量和安全问题一直都是软件开发过程中的重要的问题,特别是在国防、金融、医疗等领域。软件测试是保障软件质量和安全的常用方法,一个软件的开发必然伴随着多次的测试过程,所以软件测试对于程序开发人员来说是尤其重要的。软件测试过程一般为构造测试用例,代入程序进行测试,将输出结果与预想值比对,修改程序中的问题,如此反复进行。这样的过程是看似平常却存在一定的缺陷,因为开发人员自己构造的测试用例并不能十分完美,使用这些测试用例来执行待测程序的时候,可能漏掉程序中的关键路径或不能触发存在问题的路径,这将导致存在的问题被遗漏。虽然人工穷举出程序所有路径的方法几乎不可能实现,但程序却可以达到此目的。基于动态符号执行理论的测试用例自动生成就能有效的解决上述问题,通过它而生成的测试用例理论上能够达到路径全覆盖,这无疑为穷举所有路径的方法提供了理论基础。本课题组利用动态符号执行技术开发出一个针对Linux平台的C语言的单元测试的测试用例自动生成工具,而本文的主要研究内容在工具的插桩部分,即利用LLVM编译器框架对C程序的LLVM中间码进行分析,在中间码的相关位置插入桩函数,并通过模拟堆栈机的原理实现桩函数,使程序在执行时能够执行到桩函数,通过这些桩函数触发符号执行过程,进而自动生成测试用例。虽然目前已经有此类工具在实际项目中进行应用,但是还有许多需要完善的地方,例如路径爆炸、外部函数调用、浮点数处理等问题,本文就浮点数问题提出了一种新的解决方法。为了验证开发的测试用例自动生成工具功能的正确性,本文使用两个小程序和程序分析benckmark中的一个大程序对工具进行测试。先通过小程序对测试的流程进行了说明,对测试过程中得到的文件和数据解释分析,最终的实验结果验证了插桩部分和浮点数求解的正确性。然后利用benchmark中的大程序对整个工具进行一次完整的测试,证明了工具的有效性。