关键词:
黑盒抽象
符号执行
机器学习
软件测试
摘要:
随着现代信息社会的高速发展,软件已经进入人们生活的方方面面,为保障软件质量而对软件进行充分测试的重要性也随之愈发凸显。符号执行是近年来在软件测试领域被广泛使用的技术之一。该技术使用符号化变量而不是具体值变量作为代码的执行输入,在程序路径的分析过程中不断收集分支语句产生的路径约束,然后调用底层求解器对路径约束集合进行求解从而生成触发对应代码路径的测试用例。然而在处理现实世界中复杂的真实程序时,符号执行仍面临不少挑战。一方面,传统约束求解器的求解能力严重制约着符号执行处理复杂路径约束的能力。另一方面,当程序中包含复杂路径结构,如函数调用、循环语句等,符号执行会陷入大量路径的搜索与求解中。这些都极大地影响了符号执行技术在复杂程序上的应用。针对以上问题,本文在前期工作基于机器学习的符号执行框架的基础上,提出了一种基于黑盒抽象的新型符号执行方法。该方法不仅可以处理简单路径约束,也可将函数调用、循环语句等复杂代码片段编码为黑盒路径约束,然后通过底层机器学习指导的约束求解器进行采样、验证求解,提高符号执行对复杂代码的测试生成能力。本文的主要工作如下:●面向函数调用的黑盒抽象符号执行:为提高符号执行对包含函数调用的复杂代码的支持能力,本文提出了一种基于机器学习的函数黑盒抽象执行方法。该方法将符号执行过程中指定函数调用的路径编码为黑盒函数约束。在求解包含黑盒函数的路径约束时,符号执行框架对函数进行黑盒执行,获得的返回值被反馈给底层基于机器学习的约束求解模块进行验证学习求解。借助于函数黑盒抽象执行方法,符号执行框架跳过了对指定函数调用的展开分析,将资源投入在对主程序的路径分析中,更好地支持了包含大量函数调用的真实程序的测试覆盖。●面向循环语句的黑盒抽象符号执行:为降低符号执行在处理循环等复杂路径结构的开销,本文提出了一种对循环等复杂代码片段的预处理方法并在该方法基础上对函数黑盒符号执行功能进行了拓展。通过对循环语句等复杂代码结构的静态分析,复杂代码片段被编码替换为等价功能的黑盒函数调用。在后期符号执行过程中,这些替换的黑盒函数被指定进行黑盒执行,减轻了符号执行框架处理函数内部循环语句的负担。●基于黑盒抽象的复杂代码测试生成系统:为评估黑盒抽象符号执行的效果,本文实现了一个面向Java语言的复杂代码测试生成系统MLB-BS,并将其与传统符号执行测试工具系统进行了一系列实验对比。实验数据表明,MLB-BS在测试覆盖度表现上优于其他工具,尤其是在包含复杂代码结构的大型程序系统的测试覆盖上达到了良好的效果。