基于动态符号执行的Java程序错误检测方法技术

技术编号:18496908 阅读:24 留言:0更新日期:2018-07-21 20:05
本发明专利技术提供了一种基于动态符号执行的Java程序错误检测方法,涉及软件测试领域,本发明专利技术首先添加整数数组和字符串类型,创建数组值设置函数,并下载Jconstraints‑z3工具,对被测程序代码模块初始化,探索程序中的路径利用z3求解出约束条件对应的解,按照字符串输出方式整合形成Junit测试用例,本发明专利技术在GitHub上选取相对较为复杂的程序,Jdart支持数组变量和字符串的符号化,能够对含有数组变量和字符串的程序进行约束条件的探索,求解出相应的解同时生成Junit测试用例,所能支持的求解器的范围扩大,增加了如coral、SMTInterpol等SMT求解器的支持。

Java program error detection method based on dynamic symbol execution

This invention provides an error detection method for Java program based on dynamic symbol execution, which involves the field of software testing. Firstly, the invention adds integer array and string type, creates array value setting function, and downloads Jconstraints Z3 tool, initializes the code module of the program, and explores the path in the program to use Z3 The solution of the corresponding constraint conditions is solved and the Junit test case is formed according to the string output mode. The invention is a relatively complex program on the GitHub. Jdart supports the symbol of the array variable and string, and can find out the corresponding constraint conditions for the program containing array variables and strings. The solution can generate Junit test cases at the same time. The scope of the solver can be expanded, and the support of SMT solvers such as coral and SMTInterpol will be increased.

【技术实现步骤摘要】
基于动态符号执行的Java程序错误检测方法
本专利技术涉及软件测试领域,尤其是一种程序错误检测方法。
技术介绍
文献“基于动态符号执行的C代码缓冲区溢出检测,北京邮电大学学报,2016,Vol39(z1),p50-54”提出了一个基于底层虚拟机的中间代码的缓冲区溢出检测工具PathChecker。在动态分析阶段,首先结合模糊测试,产生随机输入数据,并实际运行待分析程序,在每次执行过程中PathChecker沿着当前的执行路径进行符号化执行,并不断更新符号状态。在此过程中,若遇到一条缓冲区访问操作指令,则使用SMT求解器检验在当前符号状态下该操作是否一定满足安全性质。符号执行引擎在执行的过程中不断收集路径约束,每次执行结束后,使用深度优先搜索算法对路径约束集合末尾的约束进行取反,以得到一组新的约束。若可以求解,则这组新约束对应于一条未探索的程序路径,否则表示探索不到新的路径,系统将重新产生随机数据。迭代整个过程,直到所有路径分析完毕或者提前设置好的运行时间用尽。此方法能够较好地检测出C代码中的缓冲区溢出漏洞。但是PathChecker的框架不具有可扩展的特性,它所支持的求解器只限定为Z3这一种,导致出现部分约束无法被求解的情况。其次,此方法的检测结果包括了覆盖率和时间,但并未生成具体的测试用例。
技术实现思路
为了克服现有技术的不足,本专利技术提供一种程序错误检测方法。本专利技术解决其技术问题所采用的技术方案包含如下步骤:步骤1:首先,在Jconstraints中添加整数数组和字符串类型,在Jconstraints的ArrayType类文件中提供构造函数、符合字符串输出标准的结果展示函数以及符号数组,创建标准的数组值设置函数;步骤2:从github上下载Jconstraints-z3工具,之后将Jconstraints-z3按照工程导入方式导入到开发集成环境eclipse中,该工具为Jdart提供了调用z3求解器的接口;步骤3:通过调用存在于Jdart中的ClassInfo中的符合初始化标准的初始化函数和方法初始化函数,对被测程序代码模块初始化:创建一个新任务,对被测试代码中需要被测试的方法的参数创建符号类型变量,对于Java语言的基本类型变量,直接生成对应的符号变量;对于数组变量和字符串,首先从堆中取出引用值,根据引用值调用堆中get方法得到整型数组或字符数组对象本身,之后调用PrimitiveArrayHandler和StringHandler类中annotateObject方法并根据参数传入方式将数组或字符串对象传入到此方法中,创建符号化对象;步骤4:利用深度优先策略探索程序中的路径,首先访问第一个邻接结点,然后再以第一个邻接结点作为初始结点,访问第一个邻接结点的第一个邻接结点,直到遍历完所有结点,在此过程中,收集if语句包括的约束条件,最后,利用z3求解器求解出约束条件对应的解,利用Jdart中的TestSuiteGenerator类将求出的约束条件对应的解,按照字符串输出方式整合,形成Junit测试用例。本专利技术的有益效果是由于采用在GitHub上选取了一些相对较为复杂的程序,从整体的效果来看,Jdart可以支持数组变量和字符串的符号化,能够对含有数组变量和字符串的程序进行约束条件的探索,求解出相应的解同时生成Junit测试用例。此外,由于引入了Jconstraints工具,所能支持的求解器的范围扩大,增加了如coral、SMTInterpol等SMT求解器的支持。附图说明图1为本专利技术基于动态符号执行的Java程序错误检测方法的实施流程图。具体实施方式下面结合附图和实施例对本专利技术进一步说明。现存技术中主要存在的问题是所采用的工具或框架不具有良好的可扩展性,所支持的求解器种类较少且检测结果的取得方式较为模糊。为了支持多种约束求解器,增强方法的可扩展性,本文引入了Jconstraints工具和Jdart工具,Jconstraints为不同的SMT求解器提供了统一的接口,Jdart在它的基础上向求解器输送生成的符号表达式并取得求解结果。为了清楚地表示出结果的获得方式,本专利技术通过添加Jdart的测试用例生成组件对于整数数组和字符串的支持,生成针对包含数组变量程序的测试用例,便于测试人员直接执行来确定程序是否存在数组越界错误。步骤1:首先,在Jconstraints中添加整数数组和字符串类型,在Jconstraints的ArrayType类文件中提供构造函数、符合字符串输出标准的结果展示函数以及符号数组创建标准的数组值设置函数;步骤2:为了让Jdart能够调用z3求解器,需要使用Jconstraints-z3工具,由于Jconstraints-z3工具的唯一链接存在于github网站上,所以从github上下载Jconstraints-z3工具,之后将Jconstraints-z3按照公知的工程导入方式导入到开发集成环境eclipse中,该工具为Jdart提供了调用z3求解器的接口;步骤3:通过调用存在于Jdart中的ClassInfo中的符合初始化标准的初始化函数和方法初始化函数,对被测程序代码模块初始化:创建一个新任务,对被测试代码中需要被测试的方法的参数创建符号类型变量,对于Java语言的基本类型变量,直接生成对应的符号变量;对于数组变量和字符串,首先从堆中取出引用值,根据引用值调用堆中get方法得到整型数组或字符数组对象本身,之后调用PrimitiveArrayHandler和StringHandler类中annotateObject方法并根据参数传入方式将数组或字符串对象传入到此方法中,创建符号化对象;步骤4:利用深度优先策略探索程序中的路径,首先访问第一个邻接结点,然后再以第一个邻接结点作为初始结点,访问第一个邻接结点的第一个邻接结点,直到遍历完所有结点,在此过程中,收集if语句包括的约束条件,最后,利用z3求解器求解出约束条件对应的解,利用Jdart中的TestSuiteGenerator类将求出的约束条件对应的解,按照字符串输出方式整合,形成Junit测试用例。实施例如下:(1)首先给出基于符号执行测试用例生成的相关定义:a)待测系统SUT(SystemUnderTest)。给定n个参数pi(=1,2…,n),被称为待测软件,这些参数可能代表系统的配置参数、内部实践或者用户输入。b)路径条件PC(PathCondition)。积累了执行某条路径中每一条语句必须满足的约束,不可达路径的执行路径定义为PU。c)约束集C。定义由对源程序进行符号执行得到的路径集合为C{c1,...,ci,...,cn},称C为约束条件集合,其中ci表示某个具体的路径条件表达式,n为约束条件的总数。d)约束PC。若是关于数值的路径条件,定义为数值约束PCN,若是关于字符串的约束,定义为字符串约束PCS;若是PC中既包含数值约束有包含字符串约束,称该PC为混合约束条件PCH。e)测试输入T。由PCN求解得到的值为关于数值约束条件的测试输入,定义为TN;由PCS求解得到的值为关于字符串约束条件的测试输入,定义为TS;相应的TN和TS的集合即关于该执行路径的测试输入T。f)求解过程S。由对约束条件结合进行求解的过程定位为S本文档来自技高网...

【技术保护点】
1.一种基于动态符号执行的Java程序错误检测方法,其特征在于包括下述步骤:步骤1:首先,在Jconstraints中添加整数数组和字符串类型,在Jconstraints的ArrayType类文件中提供构造函数、符合字符串输出标准的结果展示函数以及符号数组,创建标准的数组值设置函数;步骤2:从github上下载Jconstraints‑z3工具,之后将Jconstraints‑z3按照工程导入方式导入到开发集成环境eclipse中,Jconstraints‑z3工具为Jdart提供了调用z3求解器的接口;步骤3:通过调用存在于Jdart中的ClassInfo中的符合初始化标准的初始化函数和方法初始化函数,对被测程序代码模块初始化:创建一个新任务,对被测试代码中需要被测试的方法的参数创建符号类型变量,对于Java语言的基本类型变量,直接生成对应的符号变量;对于数组变量和字符串,首先从堆中取出引用值,根据引用值调用堆中get方法得到整型数组或字符数组对象本身,之后调用PrimitiveArrayHandler和StringHandler类中annotateObject方法并根据参数传入方式将数组或字符串对象传入到此方法中,创建符号化对象;步骤4:利用深度优先策略探索程序中的路径,首先访问第一个邻接结点,然后再以第一个邻接结点作为初始结点,访问第一个邻接结点的第一个邻接结点,直到遍历完所有结点,在此过程中,收集if语句包括的约束条件,最后,利用z3求解器求解出约束条件对应的解,利用Jdart中的TestSuiteGenerator类将求出的约束条件对应的解,按照字符串输出方式整合,形成Junit测试用例。...

【技术特征摘要】
1.一种基于动态符号执行的Java程序错误检测方法,其特征在于包括下述步骤:步骤1:首先,在Jconstraints中添加整数数组和字符串类型,在Jconstraints的ArrayType类文件中提供构造函数、符合字符串输出标准的结果展示函数以及符号数组,创建标准的数组值设置函数;步骤2:从github上下载Jconstraints-z3工具,之后将Jconstraints-z3按照工程导入方式导入到开发集成环境eclipse中,Jconstraints-z3工具为Jdart提供了调用z3求解器的接口;步骤3:通过调用存在于Jdart中的ClassInfo中的符合初始化标准的初始化函数和方法初始化函数,对被测程序代码模块初始化:创建一个新任务,对被测试代码中需要被测试的方法的参数创建符号类型变量,对...

【专利技术属性】
技术研发人员:郑炜蔺军曹石超
申请(专利权)人:西北工业大学
类型:发明
国别省市:陕西,61

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1