一种基于符号执行的数组越界检测方法

文档序号:10552822阅读:290来源:国知局
一种基于符号执行的数组越界检测方法
【专利摘要】本发明提供一种基于符号执行的数组越界检测方法,首先分析函数所有路径,输入:一个函数所有的逻辑路径,函数信息,控制流图,函数实参列表;输出:所有路径的约束系统;然后单个路径分析,输入:一条逻辑路径,函数信息,控制流图,函数实参列表。输出:该条路径的约束系统以及一些附加信息。约束系统:关于数组变量的所有范围约束;附加信息:函数信息,函数调用关系,路径信息。
【专利说明】
一种基于符号执行的数组越界检测方法
技术领域
[0001]本发明属于符号执行技术领域,涉及一种基于符号执行的数组越界检测方法。
【背景技术】
[0002]符号执行是指在不执行程序的前提下,用符号值表示程序变量的值,然后模拟程序执行来进行相关分析的技术,它可以分析代码的所有语义信息,也可以只分析部分语义信息(如只分析“内存是否释放”这一部分的语义信息)。符号执行通常也被理解为符号预测,属于静态测试方法的一种,其基本思想是:将程序源代码中变量的值采用抽象化符号的形式表示,模拟程序执行,其适用于在对路径敏感的程序分析中。通常意义下的程序执行是给出具体的输入数据使得程序能够沿着某一特定路径执行并输出与之对应的具体结果。然而符号执行的目的是分析程序中变量之间的约束关系,不需制定具体的输入数据,将变量作为代数中的抽象符号处理结合程序的约束条件进行推理,结果是一些描述变量间关系的表达式。在符号执行的过程中,CFG中的分支导致了对于变量的不同的约束条件,而这些约束条件就描述了相应路径的测试数据间的约束关系。
[0003]数组越界故障是在利用数组名和其下标引用数组中的元素时,下标值超出了数组的长度范围而产生的。当用数组名和其下标引用数组元素时,其下标形式可以归纳为以下3种形式:(I)数组下标是一常数,例如varname[7] ; (2)数组下标是一个变量,,例如varname[j] ; (3)数组下标是一个表达式,例如¥31'1^1116[;[*1^+_]_*2]。数组的下标无论是上述哪3种形式,下标都可以看作是整型表达式(常数是最简单的表达式)。但由于数组下标表达式中某些变量受用户输入或程序多分支的影响,其静态计算结果往往不是一个明确的值而是一个整型区间,即每一个数组变量映射一个区间r,区间表示数组下标的整数范围,在对数组变量进行访问时,比较区间r和区间[O,len-1], Ien表示数组变量定义的长度,如果r&[0,Ien-1 ],则对数组的操作在允许的范围之内,是正确的,否则就会发生数组越界故障。
[0004]区间运算:区间作为整型值的一种代数表现形式,满足一定的性质,这里将一些基本的代数运算如+、_、*、/等操作扩展到整型区间上,通过区间运算,实现对变量区间的更新和传播。
[0005]假设min(xl,x2,…)和max(xl,x2,…)这两个函数意义分别表示为求参数的最小值和最大值。设xe [a,b],ye[c,d],a<b,c<d^z = a+MgSzG [e,f ],区间[e,f ]可按以下规则确定:
[0006][a,b] + [c,d] = [a+c ,b+d] ; [a,b]-[c,d] = [a_d,b_c] ;[a,b]X[c,d] = [min(ac,ad,bc,bd),max(ac,ad,bc,bd) ] ;ab>0时 l/[a,b] = [ 1/b, l/a,ab〈0 时,l/[a,b] = (-°°,l/a]
[0007][min(a/c,a/d,b/c,b/d),max(a/c,a/d,b/c,b/d)],c<d〈0
[0008][min(a/c,a/d,b/c,b/d),max(a/c,a/d,b/c,b/d)],0<c^;d
[0009][-OO , + oo] ,c^O^d
[0010]}
[0011]以上是最基本的区间运算规则,,在这个基础上可以根据具体被测程序对上述规则进行扩充,用来计算数组下标表达式在程序的每条执行路径上具体区间范围r。
[0012]区间传播:所谓区间传播就是这个整型区间沿着程序路径得到不断更新和传播,使数组下标表达式中每一个变量映射一个最能反映变量此刻状态的值的区间。将整型变量映射为一个整型区间[min,max],然后通过对程序控制流图的分析,不断进行区间更新。这里,每一个整型变量对应一个区间,变量的区间可以通过多种操作进行改变,变量在定义时如果没有进行初始化,则变量区间被定义为[_°°,+ °°]。随着变量的变化,变量区间也不断变化,一般是通过赋值语句改变变量区间,对变量的区间进行重新定义,同时也可以通过其它的方法改变变量的区间,比如作为参数传递到函数体,在函数体里对参数进行操作,再传递到函数外面。通常,一个变量的定义伴随着一个区间的产生,而变量的结束暗示着区间的消亡。
[0013]符号执行虽然精度较高,但是在遍历过程中,约束会越来越复杂,求解的难度会越来越难;而区间分析在处理复杂的控制语句时会出现精度下降的问题。本方案将符号执行与区间分析相结合,利用符号执行的路径选择优势解决区间分析中存在的问题,利用区间分析的思想降低符号执行约束的复杂度。
[0014]数组越界是缓冲区溢出故障类型中的一种最常见的故障,它是由于对数组下标的操作超过了下标范围而引起的,数组越界在使用数组类型进行程序设计的软件中普遍存在。数组越界通常分为上溢和下溢。譬如声明一个数组,其大小为len,则其下标范围为R =[0,1611-1],如果以」为数组下标引用数组元素时,!_]_£1?,则不会发生故障,如果」〈0,则发生故障,称之为下溢;如果j>len_l,则称之为上溢。因此通常对数组边界的检查要包括两部分,即检查数组上界和下界,只有对下标的操作在其区间内,才能保证对数组的使用无误,否则就会发生数组越界故障。

【发明内容】

[0015]本发明为了解决上述技术问题,提出一种基于符号执行的数组越界检测方法。
[0016]本发明通过以下技术方案来实现:
[0017]—种基于符号执行的数组越界检测方法,包括以下步骤:
[0018]步骤一、分析函数所有路径,遍历函数的逻辑路径列表,得到其中的第一个路径对象path,如果path为null,则直接返回约束系统及附加信息,并退出该函数;否则将路径对象、函数信息、控制流图、实参列表作为参数,执行单个路径分析,将path指向下一个逻辑路径对象,然后执行步骤二;
[0019]步骤二、单个路径分析,如果函数实参列表的大小不为0,执行步骤三;否则,执行步骤四;
[0020]步骤三、根据函数信息,把实参的约束,值传递给形参变量,并添加到约束列表和变量类型列表中;
[0021]步骤四、遍历该路径,得到它的第一个结点node;如果node为null,则直接返回约束系统及附加信息,并退出该函数;否则,执行步骤五;
[0022]步骤五、通过node的编号信息,在控制流图中查找到对应的控制流结点,对该控制流图结点的语句类型进行判断,如果语句类型为VARIABLE_DEF,则执行步骤六;如果语句类型为Assign_EXPR,则执行步骤七;如果语句类型为for,则执行步骤八;如果语句类型为Other_EXPR,则执行步骤九;
[0023]步骤六、语句类型为VARIABLE_DEF:将该语句涉及的变量添加到变量类型列表,如果涉及的是数组或整型变量,生成区间表示,利用区间与上下界生成约束,并添加到约束列表中;
[0024]步骤七、语句类型为Assign_EXPR:如果语句涉及的变量是整型或数组变量,则进行区间运算,生成约束,并添加到约束列表中;
[0025]步骤八、语句类型为for:通过控制流图结点,得到for的条件表达式信息,解析该条件表达式,得到整形变量名称,初始值,根据相应的约束规则,生成该整型变量的约束,并以(变量名称,约束)的形式存储到变量类型列表中;
[0026]步骤九、语句类型为Other_EXPR:该语句是函数调用。根据实参和参数类型列表,如果实参是数组或整型变量,则要把约束赋给相应的形参,并且把所有实参的值赋给形参,然后执行步骤一分析函数所有路径。
【附图说明】
[0027]图1为本发明基于符号执行的数组越界检测方法流程图。
【具体实施方式】
[0028]下面对本发明作进一步介绍。
[0029]如图1所示,本方法在控制流图的基础上进行分析。
[0030](I)分析函数所有路径
[0031 ]输入:一个函数所有的逻辑路径,函数信息,控制流图,函数实参列表
[0032]输出:所有路径的约束系统
[0033]流程
[0034]1.遍历函数的逻辑路径列表,得到其中的第一个路径对象path。
[0035]2.如果path为null,则直接返回约束系统及附加信息,并退出该函数;
[0036]否则,将路径对象,函数信息,控制流图,实参列表作为参数,执行单个路径分析。
[0037]3.将path指向下一个逻辑路径对象,然后执行流程2。
[0038](2)单个路径分析
[0039]输入:一条逻辑路径,函数信息,控制流图,函数实参列表。
[0040]输出:该条路径的约束系统以及一些附加信息。约束系统:关于数组变量的所有范围约束;附加信息:函数信息,函数调用关系,路径信息。
[0041]流程:
[0042]1.如果函数实参列表的大小不为0,执行流程2;否则,执行流程3。
[0043]2.根据函数信息,把实参的约束,值传递给形参变量,并添加到约束列表和变量类型列表中。
[0044]3.遍历该路径,得到它的第一个结点node。
[0045]4.如果node为null,则直接返回约束系统及附加信息,并退出该函数;
[0046]否则,执行流程5。
[0047]5.通过node的编号信息,可以在控制流图中查找到对应的控制流结点。对该控制流图结点的语句类型进行判断,如果语句类型为VARIABLE_DEF,则执行流程6;如果语句类型为Assign_EXPR,则执行流程7;如果语句类型为for,则执行流程8;如果语句类型为Other_EXPR,则执行流程9。
[0048]6.语句类型为VARIABLE_DEF:将该语句涉及的变量添加到变量类型列表,如果涉及的是数组或整型变量,生成区间表示,利用区间与上下界生成约束,并添加到约束列表中。
[0049]7.语句类型为Assign_EXPR:如果语句涉及的变量是整型或数组变量,则进行区间运算,生成约束,并添加到约束列表中。
[0050]8.语句类型为for:通过控制流图结点,得到for的条件表达式信息,解析该条件表达式,得到整形变量名称,初始值,根据相应的约束规则,生成该整型变量的约束,并以(变量名称,约束)的形式存储到变量类型列表中。
[0051]9.语句类型为Other_EXPR:该语句是函数调用。根据实参和参数类型列表,如果实参是数组或整型变量,则要把约束赋给相应的形参,并且把所有实参的值赋给形参,然后执行(I)分析函数所有路径。
【主权项】
1.一种基于符号执行的数组越界检测方法,其特征在于,包括以下步骤: 步骤一、分析函数所有路径,遍历函数的逻辑路径列表,得到其中的第一个路径对象path,如果path为null,则直接返回约束系统及附加信息,并退出该函数;否则将路径对象、函数信息、控制流图、实参列表作为参数,执行单个路径分析,将path指向下一个逻辑路径对象,然后执行步骤二; 步骤二、单个路径分析,如果函数实参列表的大小不为O,执行步骤三;否则,执行步骤四; 步骤三、根据函数信息,把实参的约束,值传递给形参变量,并添加到约束列表和变量类型列表中; 步骤四、遍历该路径,得到它的第一个结点node;如果node为null,则直接返回约束系统及附加信息,并退出该函数;否则,执行步骤五; 步骤五、通过node的编号信息,在控制流图中查找到对应的控制流结点,对该控制流图结点的语句类型进行判断,如果语句类型为VARIABLE_DEF,则执行步骤六;如果语句类型为Assign_EXPR,则执行步骤七;如果语句类型为for,则执行步骤八;如果语句类型为Other_EXPR,则执行步骤九; 步骤六、语句类型为VARIABLE_DEF:将该语句涉及的变量添加到变量类型列表,如果涉及的是数组或整型变量,生成区间表示,利用区间与上下界生成约束,并添加到约束列表中; 步骤七、语句类型为Assign_EXPR:如果语句涉及的变量是整型或数组变量,则进行区间运算,生成约束,并添加到约束列表中; 步骤八、语句类型为for:通过控制流图结点,得到for的条件表达式信息,解析该条件表达式,得到整形变量名称,初始值,根据相应的约束规则,生成该整型变量的约束,并以(变量名称,约束)的形式存储到变量类型列表中; 步骤九、语句类型为Other_EXPR:该语句是函数调用。根据实参和参数类型列表,如果实参是数组或整型变量,则要把约束赋给相应的形参,并且把所有实参的值赋给形参,然后执行步骤一分析函数所有路径。
【文档编号】G06F11/36GK105912459SQ201610202057
【公开日】2016年8月31日
【申请日】2016年4月1日
【发明人】胡昌振, 单纯, 于泽群, 薛静锋, 赵小林
【申请人】北京理工大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1