CN108304320A - 基于动态符号执行的Java程序错误检测方法 - Google Patents
基于动态符号执行的Java程序错误检测方法 Download PDFInfo
- Publication number
- CN108304320A CN108304320A CN201810012366.9A CN201810012366A CN108304320A CN 108304320 A CN108304320 A CN 108304320A CN 201810012366 A CN201810012366 A CN 201810012366A CN 108304320 A CN108304320 A CN 108304320A
- Authority
- CN
- China
- Prior art keywords
- character string
- array
- jconstraints
- constraints
- jdart
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3684—Test management for test design, e.g. generating new test cases
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3688—Test management for test execution, e.g. scheduling of test suites
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明提供了一种基于动态符号执行的Java程序错误检测方法,涉及软件测试领域,本发明首先添加整数数组和字符串类型,创建数组值设置函数,并下载Jconstraints‑z3工具,对被测程序代码模块初始化,探索程序中的路径利用z3求解出约束条件对应的解,按照字符串输出方式整合形成Junit测试用例,本发明在GitHub上选取相对较为复杂的程序,Jdart支持数组变量和字符串的符号化,能够对含有数组变量和字符串的程序进行约束条件的探索,求解出相应的解同时生成Junit测试用例,所能支持的求解器的范围扩大,增加了如coral、SMTInterpol等SMT求解器的支持。
Description
技术领域
本发明涉及软件测试领域,尤其是一种程序错误检测方法。
背景技术
文献“基于动态符号执行的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(System Under Test)。给定n个参数pi(=1,2…,n),被称为待测软件,这些参数可能代表系统的配置参数、内部实践或者用户输入。
b)路径条件PC(Path Condition)。积累了执行某条路径中每一条语句必须满足的约束,不可达路径的执行路径定义为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,其中S的输入是约束条件集合,输出为测试输入集合与不可达路径条件。表达式为:S(C)=T AND PU___c1,...,ci,...,cn};T={T1,...,Ti,...,Tn},Ti=TNiANDTsi。
图1是本发明基于动态符号执行的Java程序错误检测方法的实施流程图。。
(2)初始化SUT代码模块,创建一个新的任务。调用processObject()方法,对被测程序方法包括的参数进行符号化,生成相关的符号变量。收集PC并进行约束求解。收集被测程序中的PC作为路径约束,将路径约束添加到C中,按深度优先路径调度策略对C中的某一项或几项取反,得到路径树上下一条路径的C,然后调用JConstraints-z3中的add(…)方法,将收集到的路径约束转化为Z3求解器可以识别的约束条件,添加到约束求解器中,最后调用solve方法对C求解,得到下一条路径的T。依次执行,直到将被测程序的所有路径都被执行,生成相应的Junit测试用例。
(3)上一步骤中的符号化操作只针对了基本的数据类型,并未对数组类型和字符串类型进行符号化。修改及求解步骤如下:
a)在JConstraints中添加数组及字符串的支持。在Jconstraints的ArrayType类文件中提供构造函数、结果展示函数以及数组值设置函数。将Z3求解器求解出的model中关于数组和字符串模块解析成数组形式输出,使Jdart中可以创建对应的数组类型符号值。
b)JConstraints-z3中添加数组及字符串的支持。在表达式产生类NativeZ3ExpressionGenrator的创建变量函数getOrCreateVar中加入数组及字符串类型。将传入的关于数组及字符串的约束表达式转化为Z3求解器可以识别的Z3断言形式,对求解出的model进行遍历,将求解的结果转化为用户常见的格式。
c)在类PrimitiveArrayHandler中的annotateObject方法中,直接创建数组类型符号;改善数组长度的读取方式,修改arraylength指令,在gov.nasa.jpf.jdart.bytecode下新建一个ARRAYLENGTH类继承jpf-core中重写的ARRAYLENGTH类,如果数组是符号值,生成length表达式;对于数组元素的读取,修改iaload指令,同样新建一个IALOAD类,在其中添加对于数组下标的检测,如:规定数组的索引变量为i,下上边界分别为ld和hd,对应的符号值分别为I、LD和HD,符号表达式为IE、LDE和HDE,则检测的表达式为IE<LDE和IE>HDE,若出现这两种表达式中的一种,引入java.lang.IndexOutOfBoundsException异常。此外,还添加了对于数组对象的检测,如:数组对象a,对应的符号值为A,符号表达式为AE,则检测表达式为AE==null,若满足此条件,引入java.lang.NullPointerException异常。如果LDEIE<HDE且AE!=null,则生成item表达式;对于数组元素的赋值,修改iastore指令,与修改iaload指令类似,新建一个IASTORE类,添加相应的检测数组下标的表达式和检测数组对象的表达式,引入数组下标越界的异常和空指针异常,如果数组下标在正常范围内且数组对象不为空,生成store表达式。
至此,完成了基于动态符号执行的Java程序错误检测方法的全部步骤。
Claims (1)
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测试用例。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810012366.9A CN108304320A (zh) | 2018-01-05 | 2018-01-05 | 基于动态符号执行的Java程序错误检测方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810012366.9A CN108304320A (zh) | 2018-01-05 | 2018-01-05 | 基于动态符号执行的Java程序错误检测方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN108304320A true CN108304320A (zh) | 2018-07-20 |
Family
ID=62868591
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810012366.9A Pending CN108304320A (zh) | 2018-01-05 | 2018-01-05 | 基于动态符号执行的Java程序错误检测方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108304320A (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110059010A (zh) * | 2019-04-12 | 2019-07-26 | 西北工业大学 | 基于动态符号执行与模糊测试的缓冲区溢出检测方法 |
CN111208986A (zh) * | 2018-11-21 | 2020-05-29 | 北京国双科技有限公司 | 变量的处理方法及装置、存储介质及处理器 |
CN112162932A (zh) * | 2020-10-30 | 2021-01-01 | 中国人民解放军国防科技大学 | 一种基于线性规划预测的符号执行优化方法及装置 |
CN112836385A (zh) * | 2021-02-19 | 2021-05-25 | 大连交通大学 | 一种结构可靠性自动计算的方法 |
CN114416598A (zh) * | 2022-03-28 | 2022-04-29 | 广州番禺职业技术学院 | 一种基于测试切片的众包测试扩增方法 |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5784553A (en) * | 1996-01-16 | 1998-07-21 | Parasoft Corporation | Method and system for generating a computer program test suite using dynamic symbolic execution of JAVA programs |
US20130318503A1 (en) * | 2012-05-25 | 2013-11-28 | Fujitsu Limited | Symbolic execution and automatic test case generation for javascript programs |
CN104750608A (zh) * | 2015-03-25 | 2015-07-01 | 南京大学 | 一种程序中基于动态符号执行的自动错误定位方法 |
CN104965788A (zh) * | 2015-07-03 | 2015-10-07 | 电子科技大学 | 一种代码静态检测方法 |
CN105224455A (zh) * | 2015-09-28 | 2016-01-06 | 北京邮电大学 | 一种自动生成字符串类型测试用例的方法 |
CN106354630A (zh) * | 2016-08-23 | 2017-01-25 | 电子科技大学 | 一种基于动态符号执行的软件缺陷检测方法 |
CN106610898A (zh) * | 2016-12-28 | 2017-05-03 | 南京大学 | 一种基于JPF的Java代码SSA单路径的生成方法 |
-
2018
- 2018-01-05 CN CN201810012366.9A patent/CN108304320A/zh active Pending
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5784553A (en) * | 1996-01-16 | 1998-07-21 | Parasoft Corporation | Method and system for generating a computer program test suite using dynamic symbolic execution of JAVA programs |
US20130318503A1 (en) * | 2012-05-25 | 2013-11-28 | Fujitsu Limited | Symbolic execution and automatic test case generation for javascript programs |
CN104750608A (zh) * | 2015-03-25 | 2015-07-01 | 南京大学 | 一种程序中基于动态符号执行的自动错误定位方法 |
CN104965788A (zh) * | 2015-07-03 | 2015-10-07 | 电子科技大学 | 一种代码静态检测方法 |
CN105224455A (zh) * | 2015-09-28 | 2016-01-06 | 北京邮电大学 | 一种自动生成字符串类型测试用例的方法 |
CN106354630A (zh) * | 2016-08-23 | 2017-01-25 | 电子科技大学 | 一种基于动态符号执行的软件缺陷检测方法 |
CN106610898A (zh) * | 2016-12-28 | 2017-05-03 | 南京大学 | 一种基于JPF的Java代码SSA单路径的生成方法 |
Non-Patent Citations (4)
Title |
---|
AYMERIC FROMHERZ 等: "Symbolic Arrays in Symbolic PathFinder", 《ACM SIGSOFT SOFTWARE ENGINEERING NOTES》 * |
KASPER LUCKOW 等: "JDart: A Dynamic Symbolic Analysis Framework", 《PROCEEDINGS OF THE 22ND INTERNATIONAL CONFERENCE ON TOOLS AND ALGORITHMS FOR THE CONSTRUCTION AND ANALYSIS OF SYSTEMS》 * |
MARKO DIMJAŠEVIĆ 等: "The Dart, the Psyco, and the Doop", 《ACM SIGSOFT SOFTWARE ENGINEERING NOTES》 * |
张羽丰: "符号执行可扩展性及可行性关键技术研究", 《中国博士学位论文全文数据库 信息科技辑》 * |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111208986A (zh) * | 2018-11-21 | 2020-05-29 | 北京国双科技有限公司 | 变量的处理方法及装置、存储介质及处理器 |
CN111208986B (zh) * | 2018-11-21 | 2023-04-07 | 北京国双科技有限公司 | 变量的处理方法及装置、存储介质及处理器 |
CN110059010A (zh) * | 2019-04-12 | 2019-07-26 | 西北工业大学 | 基于动态符号执行与模糊测试的缓冲区溢出检测方法 |
CN110059010B (zh) * | 2019-04-12 | 2023-01-31 | 西北工业大学 | 基于动态符号执行与模糊测试的缓冲区溢出检测方法 |
CN112162932A (zh) * | 2020-10-30 | 2021-01-01 | 中国人民解放军国防科技大学 | 一种基于线性规划预测的符号执行优化方法及装置 |
CN112836385A (zh) * | 2021-02-19 | 2021-05-25 | 大连交通大学 | 一种结构可靠性自动计算的方法 |
CN112836385B (zh) * | 2021-02-19 | 2023-06-20 | 大连交通大学 | 一种结构可靠性自动计算的方法 |
CN114416598A (zh) * | 2022-03-28 | 2022-04-29 | 广州番禺职业技术学院 | 一种基于测试切片的众包测试扩增方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108304320A (zh) | 基于动态符号执行的Java程序错误检测方法 | |
US9411559B2 (en) | Resolution of textual code in a graphical hierarchical model of a technical computing environment | |
Artho et al. | Combining test case generation and runtime verification | |
Mariani et al. | Compatibility and regression testing of COTS-component-based software | |
CN104572476B (zh) | 一种基于程序切片的不可达路径检测方法 | |
JPH0950389A (ja) | コンピュータシステムを使って実装される装置及び方法 | |
Wagner et al. | CAGEN: A fast combinatorial test generation tool with support for constraints and higher-index arrays | |
CN108388515A (zh) | 测试数据生成方法、装置、设备以及计算机可读存储介质 | |
CN108763064B (zh) | 一种基于黑盒函数与机器学习的代码测试生成方法和装置 | |
JP2003044275A (ja) | 変更危険度測定システム、変更危険度測定方法及び変更危険度測定プログラム | |
CN110196720A (zh) | 一种Simulink生成动态链接库的优化方法 | |
Wägemann et al. | GenE: A benchmark generator for WCET analysis | |
JP2005514600A (ja) | ユーザー定義処理機能 | |
da Cruz et al. | Gamaslicer: an online laboratory for program verification and analysis | |
WO2014142876A1 (en) | Kernel functionality checker | |
Neukirchen et al. | An approach to quality engineering of TTCN-3 test specifications | |
Cornaglia et al. | JIT-based context-sensitive timing simulation for efficient platform exploration | |
Cheung | Petri nets for protocol engineering | |
CN109597638A (zh) | 基于实时计算引擎解决数据处理、设备联动的方法及装置 | |
Lemos et al. | Data flow integration testing criteria for aspect-oriented programs | |
Ambu et al. | Studying the evolution of quality metrics in an agile/distributed project | |
Gustafsson et al. | All-times–a european project on integrating timing technology | |
Balmas et al. | DDgraph: a tool to visualize dynamic dependences | |
Zeiß et al. | TRex–An Open-Source Tool for Quality Assurance of TTCN-3 Test Suites | |
Jahier | RDBG: a reactive programs extensible debugger |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20180720 |
|
WD01 | Invention patent application deemed withdrawn after publication |