CN108563561A - 一种程序隐性约束提取方法及系统 - Google Patents
一种程序隐性约束提取方法及系统 Download PDFInfo
- Publication number
- CN108563561A CN108563561A CN201810215371.XA CN201810215371A CN108563561A CN 108563561 A CN108563561 A CN 108563561A CN 201810215371 A CN201810215371 A CN 201810215371A CN 108563561 A CN108563561 A CN 108563561A
- Authority
- CN
- China
- Prior art keywords
- node
- target variable
- constraint
- recessive
- program
- 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.)
- Granted
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/3604—Software analysis for verifying properties of programs
- G06F11/3616—Software analysis for verifying properties of programs using software metrics
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (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
本发明提供一种程序隐性约束提取方法及系统,包括:对于待测程序中的任一函数,将任一路径上的入口节点作为当前节点;获取当前节点与任一函数对应的抽象语法树上对应的当前语法节点,若当前语法节点包含目标变量,获取目标变量类型,根据目标变量类型和作用于目标变量的运算符类型匹配隐性约束规则,提取目标变量的隐性约束;否则,将当前节点的下一个节点重新作为当前节点,重复上述步骤,直到任一路径的出口节点为当前节点。本发明提出一种程序隐性约束提取方法及系统,可以实现隐性约束的提取,可以在一定程度上减小目标变量的搜索空间,保证生成测试数据的正确性,进而确保后续测试数据顺利执行。
Description
技术领域
本发明涉及软件测试技术领域,更具体地,涉及一种程序隐性约束提取方法及系统。
背景技术
在面向路径的测试数据自动生成方法中,约束系统的建立和求解是其中的关键问题。约束系统的建立需要对程序进行静态分析,获取各程序点处的程序语义,将代码抽象和近似成由目标变量组成的形式化断言集合,这些形式化断言集合即限制目标变量取值的约束。通过使用约束求解算法对这些约束进行求解,可以获得满足当前路径约束的测试数据。
在上述过程中,如何建立一个能准确反映程序语义且可解的约束系统是实现测试数据生成的前提。为了建立一个这样的约束系统,不仅要对包括复杂数据类型在内的非线性操作进行建模以获取可解的约束;还要尽可能的挖掘程序中各种操作的语义,建立相应约束,缩小后续求解空间。
基于此,提出了程序隐性约束的概念,通过分析各种操作固有语义以外的语义信息,提取程序的隐性约束,增强了约束的完备性,为后续的约束求解及测试数据执行提供了方便。
程序隐性约束的提取不仅可以在一定程度上缩小目标变量的搜索空间,更有利于生成满足路径覆盖要求的测试数据,主要包括以下几个方面:
1、隐性约束基于程序语义推导产生,是程序固有语义对目标变量产生的约束的加强,使目标变量的搜索空间进一步减小,提高了测试数据生成效率。
2、隐性约束确保生成测试数据的正确性,保证了目标变量相应操作能正确、合法的沿当前路径执行。
3、隐性约束的添加使测试数据能够顺利执行,保证了基于路径的覆盖测试流程的正确进行,使每次执行都能得到相应的路径覆盖率,间接的提高了测试覆盖率和测试效率。
因此,寻找一种高效的程序隐性约束提取方法是十分必要的。
发明内容
本发明提供一种克服上述问题或者至少部分地解决上述问题的一种程序隐性约束提取方法及系统。
根据本发明的一个方面,提供一种程序隐性约束提取方法,包括:
S1,对应待测程序中的任一函数,获取所述任一函数对应的控制流图的入口节点到出口节点的任一路径,将所述任一路径上的入口节点作为当前节点;
S2,获取所述当前节点与所述任一函数对应的抽象语法树上对应的当前语法节点,若所述当前语法节点对应赋值语句或分支语句,则对当前语法节点进行遍历访问,获取目标变量和作用于所述目标变量的运算符,根据所述目标变量类型和作用于所述目标变量的运算符类型,匹配对应的预设隐性约束规则,根据确定的预设隐性约束规则提取所述目标变量的隐性约束,所述目标变量为所述待测程序的输入变量或所述待测程序的全局变量;
否则,将所述当前节点的下一个节点重新作为所述当前节点,重复上述步骤,直到所述任一路径的出口节点为当前节点。
根据本发明的另一个方面,提供一种程序隐性约束提取系统,包括:
控制流图模块,用于对应待测程序中的任一函数,获取所述任一函数对应的控制流图的入口节点到出口节点的任一路径,将所述任一路径上的入口节点作为当前节点;
约束提取模块,用于获取所述当前节点与所述任一函数对应的抽象语法树上对应的当前语法节点,若所述当前语法节点对应赋值语句或分支语句,则对当前语法节点进行遍历访问,获取目标变量和作用于所述目标变量的运算符,根据所述目标变量类型和作用于所述目标变量的运算符类型,匹配对应的预设隐性约束规则,根据确定的预设隐性约束规则提取所述目标变量的隐性约束,所述目标变量为所述待测程序的输入变量或所述待测程序的全局变量;
否则,将所述当前节点的下一个节点重新作为所述当前节点,重复上述步骤,直到所述任一路径的出口节点为当前节点。
根据本发明的又一个方面,提供一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,使所述计算机执行所述一种程序隐性约束提取方法。
根据本发明的再一个方面,提供一种非暂态计算机可读存储介质,其特征在于,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行所述一种程序隐性约束提取方法。
本发明提出一种程序隐性约束提取方法及系统,可以实现隐性约束的提取,可以在一定程度上减小目标变量的搜索空间,保证生成测试数据的正确性,进而确保后续测试数据顺利执行。本发明基于符号执行、抽象内存建模、反例等技术,以抽象语法树及控制流图为分析对象,以路径为单位,对当前路径对应节点逐个分析,以目标变量类型及直接作用于目标变量的运算符为匹配特征,实现对预定义的隐性约束规则库中相应规则的适配,基于目标变量对应的隐性约束提取规则实现隐性约束的提取。
附图说明
图1为本发明实施例一种程序隐性约束提取方法的流程图;
图2为本发明一实施例一种程序隐性约束提取系统的控制流图;
图3为本发明又一实施例一种程序隐性约束提取系统的结构示意图。
具体实施方式
下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。
为了便于后文的说明,下面首先简单介绍抽象语法树、控制流图、符号执行、抽象内存等概念。
抽象语法树(简称AST)是源程序经过词法分析、语法分析等步骤之后生成的一种程序中间表示,是一种抽象语法结构的树状表现形式。对于抽象语法树上的节点我们主要访问以下节点,与程序变量直接相关的基础表达式(PrimaryExpression)和下标表达式(PostfixExpression),与表达式相关的赋值表达式(AssignmentExpression),逻辑表达式(LogicalExpression)及元表达式(UnaryExpression)等。
控制流图(简称CFG)是一种反应程序逻辑控制流程的有向图。通常一个函数的控制流图可表示为(N,E,entry,exit),其中N代表节点的集合反映程序中的简单语句和复合语句的条件判断以及控制流汇合点等,E代表有向边的集合,反映程序中语句间的控制流关系。entry为函数的固定唯一入口节点,exit为函数唯一的出口节点。
符号执行技术将变量抽象为符号,并使用符号值代替数字值执行程序,以此来实现对程序的分析。使用符号执行方法可以不用枚举变量的取值和状态,大大减小了程序执行的开销。本方法借鉴符号执行的思想,根据程序语义对程序进行符号化,将变量的值表示为由输入变量的符号值和常量组成的表达式,建立变量与相应符号的映射关系。约束提取即提取关于程序输入变量的符号值的限制条件。
在对程序进行符号化分析的过程中,我们需要跟踪符号的状态,对于普通数据类型来讲,我们使用<变量,值>(值为符号值)的二元模型即可模拟其不同的操作,但是对于一些复杂的数据类型,如指针、结构体等,上述二元模型无法对其状态进行跟踪模拟,为此我们引入了抽象内存模型来实现对变量状态的模拟和跟踪。抽象内存模型是一个存储变量语义和约束的静态模型,它存储了路径中到某个程序点为止各个变量的所有约束的累积。由于篇幅有限,我们只对下文需要使用的指针抽象内存模型进行简单介绍。指针抽象内存模型除了具有抽象内存地址、变量名称、变量类型等基本属性外,还具有指针指向状态和指针指向对象两个特殊属性,其中指针指向状态包括未知、空、非空三个状态。其中未知指向状态表示指针的初始状态。
图1为本发明实施例一种程序隐性约束提取方法的流程图,如图1所示,该方法包括:
S1,对于待测程序中的任一函数,获取所述任一函数的控制流图的入口节点到出口节点的任一路径,将所述任一路径上的入口节点作为当前节点;
S2,获取所述当前节点与所述任一函数对应的抽象语法树上对应的当前语法节点,若所述当前语法节点对应赋值语句或分支语句,则对当前语法节点进行遍历访问,获取目标变量和作用于所述目标变量的运算符,根据所述目标变量类型和作用于所述目标变量的运算符类型,匹配对应的预设隐性约束规则,根据确定的预设隐性约束规则提取所述目标变量的隐性约束,所述目标变量为所述待测程序的输入变量或所述待测程序的全局变量;
否则,将所述当前节点的下一个节点重新作为所述当前节点,重复上述步骤,直到所述任一路径的出口节点为当前节点。
首先,待测程序中可能包含多个函数,每个函数都有自己对应的控制流图和抽象语法树,以其中一个函数为例进行说明。
在该函数对应的控制流图上,选取一条从入口节点到出口节点的路径,同样地,从入口节点到出口节点可能有多条路径,本发明实施例以其中任意一条路径为例进行说明,先将该路径上的入口节点作为当前节点,在抽象语法树上找到与该当前节点对应的当前语法节点。
需要说明的是,抽象语法树可以先通过采用宏展开、条件编译预处理等方法对读入的被处理程序进行预处理,再通过将被测程序中的字符序列转换为单词序列进行词法分析,最后再将单词序列组成各类语法短句进行语法分析得到。
若当前语法节点的类型包括赋值类型或分支类型,则根据当前语法节点所属的类型,采用相应的遍历方法遍历该当前语法节点,从而判断当前语法节点是否包含目标变量。
此处,目标变量是指待测程序的输入变量或者是待测程序的全局变量,只要当前语法节点包括待测程序的一个输入变量或者一个全局变量,就认为当前语法节点是包含目标变量的。
然后根据当前语法节点包含的目标变量的类型,在预定义的隐性约束规则库中查找符合目标变量类型的预设隐性约束规则,如果查找到的预设隐性约束规则中包含作用于目标变量的运算符,就利用该预设隐性约束规则提取该目标变量的约束。
需要说明的是,预定义的隐性约束规则库中包含很多预设隐性约束规则,不同的预设隐性约束规则适合不同的目标类型,根据目标变量的类型和相应操作的类型,匹配并确定相应的预设隐性约束规则。其中,预定义的隐性约束规则库包括的预设隐性约束规则如下:
隐性约束规则使用三元组表示:
Rule={VarType,Oper,IC}
VarType表示当前规则下目标变量的数据类型,包括普通类型变量和指针变量,普通类型变量包括整型、浮点型、字符型。
Oper表示当前规则下含有隐性约束的运算符类型。
IC表示当前规则下对目标变量的隐性约束,根据目标变量数据类型和操作类型人工给出。
根据运算符意义及相关目标变量类型,制订了四类隐性约束规则:
(1)指针类
由于指针具有可以存储地址,引用其他变量的特殊属性,在符号执行过程中,我们采用抽象内存建模的方法,从指针指向和指向状态两个属性观测不同操作对指针产生的影响。
表1指针运算符
通过对可以作用于指针的操作进行分析,我们发现当指针进行关系运算、算术运算、间接寻址运算时,根据C语言的语法规定,需要对指针的指向或指向状态进行相应的约束。如两个指针进行关系运算,则二者必须是可比较的,即指向同一数组对象。表1中给出了各运算符作用于指针时所需的隐性约束。指针类隐性约束规则的目标变量类型为指针,操作为表1中所示运算符,对应的隐性约束如表1所示。
(2)数组类
数组由于其结构化的特性我们依然需要使用抽象内存建模方法记录数组状态。针对数组类型的特性,我们从数组长度和数组成员两个属性对数组进行相应描述。
数组进行下标运算且下标为整型目标变量时,该目标变量具有小于数组长度的隐性约束。数组类隐性约束规则目标变量类型为整型变量,操作为下标运算符,隐性约束为目标变量小于数组长度。
(3)函数调用类
当目标变量作为库函数参数时,由于库函数的语法、语义要求,目标变量必须满足一定的条件库函数才能正确执行。根据不同的库函数所具有的不同限制条件,我们将函数调用类隐性约束分为域限制、避免空指针、避免缓冲区溢出三种情况。域限制类,如平方根函数sqrt(x),须有x≥0,该规则中目标变量类型为普通类型,操作为sqrt,这里我们将库函数名作为目标变量的运算符,隐性约束为x≥0;避免空指针类,如字符串求长函数strlen(char*s),指针s非空,该规则中目标变量类型为指针类型,操作为strlen,隐性约束为s非空;避免缓冲区溢出类,如字符串复制函数strcpy(char*s1,char*s2),字符串s1的长度大于s2的长度,该规则中目标变量类型为指针类型,操作为strcpy,隐性约束为s1的长度大于s2。库函数类隐性约束规则目标变量类型为具有隐性约束库函数的参数类型,操作为相应的库函数类型,隐性约束根据不同的库函数输入要求进行制定。
(4)算术运算类
该类隐性约束规则适用于除法操作。当目标变量为普通类型且作为除数时,具有不等于零的隐性约束。
如果当前语法节点不包含目标变量,或者,如果查找到的预设隐性约束规则中不包含作用于目标变量的运算符,将该路径入口节点的下一个节点重新作为当前节点,重复上述判断过程,直到判断完该路径上所有节点,则认为该函数的一条路径的隐性约束分析完毕,进入该函数下一条路径的隐性约束分析,具体步骤与上述过程相同。
分析完待测程序中的一个函数的隐性约束后,在分析待测程序中其他函数的隐性约束。
本发明实施例提出一种程序隐性约束提取方法,可以实现隐性约束的提取,可以在一定程度上减小目标变量的搜索空间,保证生成测试数据的正确性,进而确保后续测试数据顺利执行。本发明实施例基于符号执行、抽象内存建模、反例等技术,以抽象语法树及控制流图为分析对象,以路径为单位,对当前路径对应节点逐个分析,以目标变量类型及直接作用于目标变量的运算符为匹配特征,实现对预定义的隐性约束规则库中相应规则的适配,基于目标变量对应的隐性约束提取规则实现隐性约束的提取。
在上述实施例的基础上,优选地,步骤S3中,所述根据所述当前语法节点的类型,判断是否对所述当前语法节点进行遍历,以获取目标变量,包括:
若所述当前语法节点为分支节点,遍历所述当前语法节点的每一子节点,判断所述当前语法节点是否包含所述目标变量。
具体地,如果当前语法节点的类型为分支节点,变量该当前语法节点中的每一个子节点,看子节点中是否包含目标变量,只要其中一个子节点包含目标变量,就认为当前语法节点是包含该目标变量的。
在上述实施例的基础上,优选地,步骤S3中,所述根据所述当前语法节点的类型,判断是否对所述当前语法节点进行遍历,以获取目标变量,包括:
若所述当前语法节点为赋值节点,遍历所述当前语法节点的每一左孩子节点和每一右孩子节点,判断所述当前语法节点是否包含所述目标变量。
具体地,如果当前语法节点的类型为赋值节点,只需要变量当前语法节点的每个左孩子节点和每个右孩子节点,来判断当前语法节点中是否包含目标变量。
本发明实施例根据当前语法节点的类型,选择合适的遍历方法,可以提高遍历效率,从而提高本发明执行的效率,缩短执行的时间。
在上述实施例的基础上,优选地,步骤S3中,所述根据所述目标变量类型和作用于所述目标变量的运算符类型匹配对应的预设隐性约束规则,根据确定的预设隐性约束规则提取所述目标变量的隐性约束,包括:
若所述目标变量为指针类型变量,获取所述指针类型变量对应的所有预设隐性约束规则,包括指针类、函数调用类隐性约束规则;
获取所述目标变量的运算符类型,根据运算符类型确定所述目标变量隐性约束规则;
通过所述指针类型目标变量对应的预设隐性约束规则提取所述目标变量的隐性约束。
具体地,依次分析提取到的目标变量及直接作用于目标变量的运算符,取第一组目标变量及直接作用于目标变量的运算符。
接着,判断目标变量类型是否为指针变量或普通变量,普通变量指整型、浮点型、字符型。
如果是,根据目标变量类型判断其可能符合的预设隐性约束规则,如为指针变量则可能满足指针类、或函数调用类隐性约束提取规则,如为普通变量则可能满足算术运算类、数组类、函数调用类隐性约束规则。
根据直接作用于目标变量的运算符类型确定目标变量对应的预设隐性约束规则,如运算符包含在目标变量可能符合的预设隐性约束规则中,则利用该预设隐性约束规则提取该目标变量的隐性约束。
在上述实施例的基础上,优选地,步骤S3中,所述根据所述目标变量类型和作用于所述目标变量的运算符类型匹配对应的预设隐性约束规则,根据确定的预设隐性约束规则提取所述目标变量的隐性约束,包括:
若所述目标变量对应的预设隐性约束规则属于函数调用类隐性约束规则,获取以所述目标变量为参数的调用函数,若函数调用类提取规则包含所述调用函数,根据所述函数调用类规则提取所述目标变量的隐性约束。
具体地,如果目标变量对应的预设隐性约束规则属于函数调用类规则,获取以该目标变量为参数的调用函数,如果该函数调用类规则包括该调用函数,通过该函数调用类规则提取目标变量的隐性约束。
本发明实施例通过人工制定相应的隐性约束提取规则,结合约束提取算法,以目标变量类型及操作类型匹配相应规则,实现了隐性约束的自动化提取。该方法可以应用于测试用例自动生成等软件测试的各个子领域,提高软件测试的效率。
在上述实施例的基础上,优选地,步骤S1之前还包括:
获取所述待测程序中每一函数的抽象语法树和控制流图。
图2为本发明一实施例一种程序隐性约束提取系统的控制流图,如图2所示,假设当前待处理路径控制流图节点序号为0→1→2→4→5→6→7。由于篇幅限制此处我们直接跳到节点stmt_2给出隐性约束的分析提取过程。
example.c源代码如下所示:
输入控制流图节点stmt_2,将stmt_2作为当前节点,由控制流图的当前节点节点索引到相应的抽象语法树的当前语法节点,当前语法节点为ExpressionStatement,为赋值语句。
对当前语法节点的右孩子节点进行递归分析,分别查看叶子节点,根据节点属性判断当前变量为目标变量。提取作用于目标变量的运算符()。当前提取到的目标变量及操作为指针变量mesg,运算符strlen。指针变量可能满足指针类、或函数调用类隐性约束提取规则。运算符strlen属于函数调用类中运算符,所以目标变量满足函数调用类提取规则。
继续对当前语法节点的子节点进行递归分析,提取当前函数类型信息,将函数类型作为运算符并对函数调用类隐性约束规则进行搜索,当前函数strlen属于避免空指针异常类隐性约束,根据相应隐性约束规则为目标变量添加指针状态非空隐性约束,并建立指向字符串的指向关系。
对后续节点重复进行上述操作,没有发现包括隐性约束的目标变量及操作,当分析到func_out_getstring_7节点时,发现当前节点为尾节点,结束对当前函数单元分析。
图3为本发明又一实施例一种程序隐性约束提取系统的结构示意图,如图3所示,该系统包括控制流图模块和约束提取模块,具体地,每个模块的功能如下:
控制流图模块301,用于对应待测程序中的任一函数,获取所述任一函数对应的控制流图的入口节点到出口节点的任一路径,将所述任一路径上的入口节点作为当前节点;
约束提取模块302,用于获取所述当前节点对应的所述任一函数对应的抽象语法树上的当前语法节点,根据所述当前语法节点的类型,判断所述当前语法节点是否包含目标变量,若所述当前语法节点包所述含目标变量,获取所述目标变量和作用于所述目标变量的运算符,根据所述目标变量对应的预设隐性约束规则和作用于所述目标变量的运算符,提取所述目标变量的隐性约束,所述目标变量为输入变量或全局变量;
否则,将所述当前节点的下一个节点重新作为所述当前节点,重复上述步骤,直到所述任一路径的出口节点为当前节点。
首先,待测程序中可能包含多个函数,每个函数都有自己对应的控制流图和抽象语法树,以其中一个函数为例进行说明。
控制流图模块301在该函数对应的控制流图上,选取一条从入口节点到出口节点的路径,同样地,从入口节点到出口节点可能有多条路径,本发明实施例以其中任意一条路径为例进行说明,先将该路径上的入口节点作为当前节点,在抽象语法树上找到与该当前节点对应的当前语法节点。
然后,约束提取模块302根据当前语法节点包含的目标变量的类型,在预定义的隐性约束规则库中查找符合目标变量类型的预设隐性约束规则,如果查找到的预设隐性约束规则中包含作用于目标变量的运算符,就利用该预设隐性约束规则提取该目标变量的约束。
需要说明的是,预定义的隐性约束规则库中包含很多预设隐性约束规则,不同的预设隐性约束规则适合不同的目标类型,根据目标变量的类型,查找比较合适的预设隐性约束规则。其中,预定义的隐性约束规则库的具体内容请参考上述方法实施例。
如果当前语法节点不包含目标变量,或者,如果查找到的预设隐性约束规则中不包含作用于目标变量的运算符,将该路径入口节点的下一个节点重新作为当前节点,重复上述判断过程,直到判断完该路径上所有节点,则认为该函数的一条路径的隐性约束分析完毕,进入该函数下一条路径的隐性约束分析,具体步骤与上述过程相同。
分析完待测程序中的一个函数的隐性约束后,在分析待测程序中其他函数的隐性约束。
本发明实施例提出一种程序隐性约束提取系统,可以实现隐性约束的提取,可以在一定程度上减小目标变量的搜索空间,保证生成测试数据的正确性,进而确保后续测试数据顺利执行。本发明实施例基于符号执行、抽象内存建模、反例等技术,以抽象语法树及控制流图为分析对象,以路径为单位,对当前路径对应节点逐个分析,以目标变量类型及直接作用于目标变量的运算符为匹配特征,实现对预定义的隐性约束规则库中相应规则的适配,基于目标变量对应的隐性约束提取规则实现隐性约束的提取。
本方面另一实施例公开一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,计算机能够执行上述各方法实施例所提供的方法,例如包括:
S1,对于待测程序中的任一函数,获取所述任一函数的控制流图的入口节点到出口节点的任一路径,将所述任一路径上的入口节点作为当前节点;
S2,获取所述当前节点与所述任一函数对应的抽象语法树上对应的当前语法节点,若所述当前语法节点对应赋值语句或分支语句,则对当前语法节点进行遍历访问,获取目标变量和作用于所述目标变量的运算符,根据所述目标变量类型和作用于所述目标变量的运算符类型,匹配对应的预设隐性约束规则,根据确定的预设隐性约束规则提取所述目标变量的隐性约束,所述目标变量为所述待测程序的输入变量或所述待测程序的全局变量;
否则,将所述当前节点的下一个节点重新作为所述当前节点,重复上述步骤,直到所述任一路径的出口节点为当前节点。
本发明再一实施例提供一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行上述各方法实施例所提供的方法,例如包括:
S1,对于待测程序中的任一函数,获取所述任一函数的控制流图的入口节点到出口节点的任一路径,将所述任一路径上的入口节点作为当前节点;
S2,获取所述当前节点与所述任一函数对应的抽象语法树上对应的当前语法节点,若所述当前语法节点对应赋值语句或分支语句,则对当前语法节点进行遍历访问,获取目标变量和作用于所述目标变量的运算符,根据所述目标变量类型和作用于所述目标变量的运算符类型,匹配对应的预设隐性约束规则,根据确定的预设隐性约束规则提取所述目标变量的隐性约束,所述目标变量为所述待测程序的输入变量或所述待测程序的全局变量;
否则,将所述当前节点的下一个节点重新作为所述当前节点,重复上述步骤,直到所述任一路径的出口节点为当前节点。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
以上所描述的显示装置的测试设备等实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
最后,本发明的方法仅为较佳的实施方案,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (9)
1.一种程序隐性约束提取方法,其特征在于,包括:
S1,对于待测程序中的任一函数,获取所述任一函数的控制流图的入口节点到出口节点的任一路径,将所述任一路径上的入口节点作为当前节点;
S2,获取所述当前节点与所述任一函数对应的抽象语法树上对应的当前语法节点,若所述当前语法节点对应赋值语句或分支语句,则对当前语法节点进行遍历访问,获取目标变量和作用于所述目标变量的运算符,根据所述目标变量类型和作用于所述目标变量的运算符类型,匹配对应的预设隐性约束规则,根据确定的预设隐性约束规则提取所述目标变量的隐性约束,所述目标变量为所述待测程序的输入变量或所述待测程序的全局变量;
否则,将所述当前节点的下一个节点重新作为所述当前节点,重复上述步骤,直到所述任一路径的出口节点为当前节点。
2.根据权利要求1所述方法,其特征在于,步骤S3中,所述根据所述当前语法节点的类型,判断是否进行进一步遍历,包括:
若所述当前语法节点为分支节点,遍历所述当前语法节点的每一子节点,判断所述当前语法节点是否包含所述目标变量。
3.根据权利要求1所述方法,其特征在于,步骤S3中,所述根据所述当前语法节点的类型,判断所述当前语法节点是否包含目标变量,包括:
若所述当前语法节点为赋值节点,遍历所述当前语法节点的每一左孩子节点和每一右孩子节点,判断所述当前语法节点是否包含所述目标变量。
4.根据权利要求1所述方法,其特征在于,步骤S3中,所述根据所述目标变量类型和作用于所述目标变量的运算符类型,匹配对应的预设隐性约束规则,根据确定的预设隐性约束规则提取所述目标变量的隐性约束,包括:
若所述目标变量为指针类型变量,获取所述指针类型变量对应的所有预设隐性约束规则,所述指针类型变量对应的所有预设隐性约束规则包括指针类、函数调用类隐性约束规则;
获取所述目标变量的运算符类型,根据运算符类型确定所述目标变量隐性约束规则;
通过所述指针类型目标变量对应的预设隐性约束规则提取所述目标变量的隐性约束。
5.根据权利要求1所述方法,其特征在于,步骤S3中,所述据所述目标变量类型和作用于所述目标变量的运算符类型,匹配对应的预设隐性约束规则,包括:
若所述目标变量为普通变量,获取所述普通变量对应的所有隐性约束规则,所述普通变量对应的所有隐性约束规则包括算术运算类、数组类、函数调用类隐性约束规则;
获取所述目标变量的运算符类型,根据运算符类型确定所述目标变量隐性约束规则;
通过所述普通目标变量对应的预设隐性约束规则提取所述目标变量的隐性约束。
6.根据权利要求1所述方法,其特征在于,步骤S1之前还包括:获取所述待测程序中每一函数的抽象语法树和控制流图。
7.一种程序隐性约束提取系统,其特征在于,包括:
控制流图模块,用于对应待测程序中的任一函数,获取所述任一函数对应的控制流图的入口节点到出口节点的任一路径,将所述任一路径上的入口节点作为当前节点;
约束提取模块,用于获取所述当前节点对应的所述任一函数对应的抽象语法树上的当前语法节点,若所述当前语法节点对应赋值语句或分支语句,则对当前语法节点进行遍历访问,获取目标变量和作用于所述目标变量的运算符,根据所述目标变量类型和作用于所述目标变量的运算符类型,匹配对应的预设隐性约束规则,根据确定的预设隐性约束规则提取所述目标变量的隐性约束,所述目标变量为输入变量或全局变量;
否则,将所述当前节点的下一个节点重新作为所述当前节点,重复上述步骤,直到所述任一路径的出口节点为当前节点。
8.一种计算机程序产品,其特征在于,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,使所述计算机执行如权利要求1至6任一所述的方法。
9.一种非暂态计算机可读存储介质,其特征在于,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行如权利要求1至6任一所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810215371.XA CN108563561B (zh) | 2018-03-15 | 2018-03-15 | 一种程序隐性约束提取方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810215371.XA CN108563561B (zh) | 2018-03-15 | 2018-03-15 | 一种程序隐性约束提取方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108563561A true CN108563561A (zh) | 2018-09-21 |
CN108563561B CN108563561B (zh) | 2020-06-23 |
Family
ID=63532813
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810215371.XA Active CN108563561B (zh) | 2018-03-15 | 2018-03-15 | 一种程序隐性约束提取方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108563561B (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109522232A (zh) * | 2018-11-16 | 2019-03-26 | 中山大学 | 空指针检测方法 |
CN112000424A (zh) * | 2020-07-17 | 2020-11-27 | 北京达佳互联信息技术有限公司 | 应用程序的控制方法、装置、终端及存储介质 |
WO2021088676A1 (zh) * | 2019-11-04 | 2021-05-14 | 拜椰特(上海)软件技术有限公司 | 计算机编程语言访问方法 |
CN114328231A (zh) * | 2021-12-29 | 2022-04-12 | 苏州浪潮智能科技有限公司 | 测试方法、装置、电子设备及存储介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104536883A (zh) * | 2014-12-05 | 2015-04-22 | 北京邮电大学 | 一种静态缺陷检测方法及其系统 |
CN105117341A (zh) * | 2015-09-06 | 2015-12-02 | 电子科技大学 | 一种基于动态符号执行的分布式自动测试案例生成方法 |
CN105224455A (zh) * | 2015-09-28 | 2016-01-06 | 北京邮电大学 | 一种自动生成字符串类型测试用例的方法 |
CN105786715A (zh) * | 2016-04-08 | 2016-07-20 | 南京大学 | 一种程序静态自动分析方法 |
US20170286271A1 (en) * | 2016-03-30 | 2017-10-05 | International Business Machines Corporation | Symbolic execution of alternative branches |
-
2018
- 2018-03-15 CN CN201810215371.XA patent/CN108563561B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104536883A (zh) * | 2014-12-05 | 2015-04-22 | 北京邮电大学 | 一种静态缺陷检测方法及其系统 |
CN105117341A (zh) * | 2015-09-06 | 2015-12-02 | 电子科技大学 | 一种基于动态符号执行的分布式自动测试案例生成方法 |
CN105224455A (zh) * | 2015-09-28 | 2016-01-06 | 北京邮电大学 | 一种自动生成字符串类型测试用例的方法 |
US20170286271A1 (en) * | 2016-03-30 | 2017-10-05 | International Business Machines Corporation | Symbolic execution of alternative branches |
CN105786715A (zh) * | 2016-04-08 | 2016-07-20 | 南京大学 | 一种程序静态自动分析方法 |
Non-Patent Citations (1)
Title |
---|
王志文等: "基于程序切片的测试用例生成系统研究与实现", 《计算机研究与发展》 * |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109522232A (zh) * | 2018-11-16 | 2019-03-26 | 中山大学 | 空指针检测方法 |
CN109522232B (zh) * | 2018-11-16 | 2021-10-22 | 中山大学 | 空指针检测方法 |
WO2021088676A1 (zh) * | 2019-11-04 | 2021-05-14 | 拜椰特(上海)软件技术有限公司 | 计算机编程语言访问方法 |
CN112000424A (zh) * | 2020-07-17 | 2020-11-27 | 北京达佳互联信息技术有限公司 | 应用程序的控制方法、装置、终端及存储介质 |
CN114328231A (zh) * | 2021-12-29 | 2022-04-12 | 苏州浪潮智能科技有限公司 | 测试方法、装置、电子设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN108563561B (zh) | 2020-06-23 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Russell et al. | Automated vulnerability detection in source code using deep representation learning | |
CN110245496B (zh) | 一种源代码漏洞检测方法及检测器和其训练方法及系统 | |
CN109697162B (zh) | 一种基于开源代码库的软件缺陷自动检测方法 | |
CN111459799B (zh) | 一种基于Github的软件缺陷检测模型建立、检测方法及系统 | |
CN109426615A (zh) | 过程间的空指针解引用检测方法、系统、设备以及介质 | |
CN108614707A (zh) | 静态代码检查方法、装置、存储介质和计算机设备 | |
US20010037492A1 (en) | Method and apparatus for automatically extracting verification models | |
CN108563561A (zh) | 一种程序隐性约束提取方法及系统 | |
US8732676B1 (en) | System and method for generating unit test based on recorded execution paths | |
US20020100022A1 (en) | Method and apparatus for automatic verification of properties of a concurrent software system | |
CN108563556A (zh) | 基于差分演化算法的软件缺陷预测优化方法 | |
CN116049831A (zh) | 一种基于静态分析和动态分析的软件漏洞检测方法 | |
CN109634869A (zh) | 基于语义等价验证的二进制翻译中间表示正确性测试方法及装置 | |
CN101576850B (zh) | 一种改进的面向宿主的嵌入式软件白盒测试方法 | |
Fry et al. | Clustering static analysis defect reports to reduce maintenance costs | |
Xu et al. | Multi-Granularity Code Smell Detection using Deep Learning Method based on Abstract Syntax Tree. | |
CN115495755A (zh) | 一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法 | |
CN109408385A (zh) | 一种基于缺陷规则和分类反馈的缺陷发现方法 | |
Yu et al. | Learning the relation between code features and code transforms with structured prediction | |
Kaur et al. | A systematic literature review on the use of machine learning in code clone research | |
CN112965909B (zh) | 测试数据、测试用例生成方法及系统、存储介质 | |
CN116975881A (zh) | 一种基于llvm的漏洞细粒度定位方法 | |
CN117707612A (zh) | 代码的处理方法、装置及电子设备 | |
US20030140018A1 (en) | Method of tuning a decision network and a decision tree model | |
CN109032946B (zh) | 一种测试方法和装置、计算机可读存储介质 |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |