CN101937390A - 源代码缺陷分析中一种基于区域的内存建模方法 - Google Patents

源代码缺陷分析中一种基于区域的内存建模方法 Download PDF

Info

Publication number
CN101937390A
CN101937390A CN2010101033714A CN201010103371A CN101937390A CN 101937390 A CN101937390 A CN 101937390A CN 2010101033714 A CN2010101033714 A CN 2010101033714A CN 201010103371 A CN201010103371 A CN 201010103371A CN 101937390 A CN101937390 A CN 101937390A
Authority
CN
China
Prior art keywords
zone
memory
region
pointer
expression formula
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
Application number
CN2010101033714A
Other languages
English (en)
Inventor
许中兴
张健
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Zhang Yan
Original Assignee
BEIJING CODETEST INFORMATION TECHNOLOGY Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by BEIJING CODETEST INFORMATION TECHNOLOGY Co Ltd filed Critical BEIJING CODETEST INFORMATION TECHNOLOGY Co Ltd
Priority to CN2010101033714A priority Critical patent/CN101937390A/zh
Publication of CN101937390A publication Critical patent/CN101937390A/zh
Pending legal-status Critical Current

Links

Images

Landscapes

  • Debugging And Monitoring (AREA)
  • Stored Programmes (AREA)

Abstract

本发明提供源代码缺陷分析中一种基于区域的内存建模方法包括下列操作步骤:(1)从表达式到其所对应的内存区域建立第一个映射;(2)判断是否含有赋值操作:是,执行步骤(3);否,执行步骤(1);(3)从内存区域到其对应的值建立第二个映射。本发明的目的基于区域的内存建模方法针对缺陷分析中常用的路径敏感分析方法,给出了一种精确的从表达式到其对应的内存块的计算方法。有了这种计算方法,就可以精确的表示指针变量的值、数组变量和数组元素的关系、指针类型转换等这些复杂的内存结构,也就是说可以精确的表示程序中每个表达式的值,对表达式进行精确的求值,从而可以对程序进行多种缺陷分析。

Description

源代码缺陷分析中一种基于区域的内存建模方法
技术领域
本发明涉及一种在软件源代码中检测缺陷的技术,确切的说,涉及一种软件源代码缺陷分析中一种基于区域的内存建模方法,属于计算机信息安全技术领域。
背景技术
程序分析的目的之一是建立从程序中的表达式到其所对应的值的映射。程序固有的操作模型是不利于对程序的正确性进行分析的,所以需要建立一个新的模型对程序进行分析。建模有多种方法,例如可以使用数学中的格、自动机或者是完整的程序状态模型,这三种建模方法对应的分析方法分别是数据流分析、模型检测和符号执行,建模方式的不同决定了分析方法的不同。在程序的执行过程中,程序的每一点的状态都是具体可知的,只需要读取程序的内存状态,检查它是否满足正确性条件的描述,此种做法就是软件的动态测试。给一个输入,运行程序,看结果是否满足正确性要求。软件测试的不足之处在于它只能检查在一种输入下的正确性,换一种输入,则需要重新执行一遍程序。然而程序的输入是无穷多的,在一般情况下不可能穷举所有的可能性进行测试,这种测试不能保证程序正确的原因。
数据流分析是一组在不运行程序的条件下,从程序中获取数据流信息的技术,所以较静态分析,数据流信息有:可到达的变量定义、可用的表达式、别名信息等等。从分析的精度来分类,数据流分析可以分为流不敏感、流敏感和路径敏感三种,再以错误检测为目标的静态分析中,需要的是精确的信息,路径敏感的分析方法就变的非常的适用。传统数据流分析的方法包括:Allen的强连通区域方法、Kildall的迭代法、Ullman的T1-T2分析、Kennedy的node-listing算法、Farrow,Kennedy,Zucconi的图语法方法、消去法,比如区间分析、Rosen的语法导向方法、结构分析、slotwise分析。
对于C语言程序的分析一直有一个困难的问题是,由于C语言中指针的存在,由指针引起的别名问题不好解决。所谓别名就是对于同一块内存,有不同的表达式可以指向它。C语言在类型的转换方面相当灵活,对指针的类型转换更是限制很少。程序员几乎可以在任意类型的指针之间进行转换,这对精确的程序分析造成了极大的困难,从而对指针相关的缺陷检测也变得困难重重。
目前在编译器和程序分析工具中解决别名问题的办法是使用各种别名分析和指针分析算法,给出在一个程序点处,能够指向同一个内存块的所有表达式的集合。但是这类别名分析算法不适用于需要精确分析的代码缺陷检测工具,因为它给每个内存块关联的是一个表达式的集合,这样得到的结果过于粗略,使得缺陷分析得到许多虚假报错,甚至无法进行。
另一种较为通用的内存建模方法是直接建立从变量到它的值的映射。在一般的检测工具中,并没有建立复杂的内存模型,而是直接建立从变量到它们的值的映射。这种简单的存储模型在处理不包含指针的代码时,还可以适用。但是对于包含指针的代码,由于指针引入了复杂的别名关系,对于存储块的区分无法直接从名字进行,这种简单内存模型就无法适用,从而大大削弱了检测工具的能力。
例如对于程序:
void f(){
  intx;
  x=3;
}
通常将其存储建模为一个从变量”x”到值3的映射。这种直接映射对于不包含指针的普通变量是可以表示的。但是C程序中使用大量的指针,数组,结构等语法结构,例如下面的程序:
void f(){
struct s{
     int x;
     int z[2];
}d;
int*p=malloc(10)
}
其中指针变量*sp的值就无法通过直接映射进行建模,并且数组变量z和数组元素z[0],z[1]的关系也无法表示。
又例如对于代码:
int a[10];
int*p;
p=a;
p++;
*p=3;
这里既有数组变量,也有指针算术,普通的直接从变量到值的内存模型根本无法处理这样的程序。
发明内容
本发明的目的:基于区域的内存建模方法针对缺陷分析中常用的路径敏感分析方法,给出了一种精确的从表达式到其对应的内存块的计算方法。有了这种计算方法,就可以精确的表示指针变量的值、数组变量和数组元素的关系、指针类型转换等这些复杂的内存结构,也就是说可以精确的表示程序中每个表达式的值,对表达式进行精确的求值,从而可以对程序进行多种缺陷分析。
为实现上述发明目的,本发明所提供的技术方案的基本构思如下:
本发明提供源代码缺陷分析中一种基于区域的内存建模方法,其特殊之处在于:包括下列操作步骤:(1)从表达式到其所对应的内存区域建立第一个映射;(2)判断是否含有赋值操作:是,执行步骤(3);否,执行步骤(1);(3)从内存区域到其对应的值建立第二个映射。
所述步骤(1)的方法为根据表达式中数据的种类建立对应的内存区域。
所述步骤(1)的方法还包括根据不同内存区域之间关系建立区域模型。
所述步骤(3)的方法采用数据结构实现第二个映射。
所述建立对应的内存区域,包括下列操作步骤:对于变量,创建与其对应的变量区域,所述变量区域包括全局变量区域和局部变量区域;或者,对于数组元素,以该数组的变量区域以及该元素的下标为特征,创建数组元素区域;或者,对于结构体的域,以该结构体的区域以及域的名字为特征,创建结构体域区域;或者,对于字符串常量,建立字符串区域;或者,对于动态分配的内存区域对应的区域为符号区域。
所述建立区域模型的步骤如下;区域模型含有三个基础区域分别为栈区域、堆区域和全局存储区域,分别对应于C程序的栈、堆和全局存储;局部变量区域的父区域为栈区域;全局变量区域的父区域是全局存储区域;数组元素区域的父区域为该数组对应的区域;结构体域区域的父区域为该结构体对应的区域;字符串区域的父区域为全局存储区域;符号区域的父区域为堆区域。
所述数据结构实现第二个映射是根据数据元素间关系的不同特性采用下列四类结构:集合结构、线性结构、树型结构或者图形结构。
根据所述第一个映射和第二个映射进行对各种表达式的求值,步骤如下:第一步,由表达式得到该表达式对应的唯一的内存区域;第二步,由该内存区域得到该表达式的值。
含有指针操作的表达式求值的步骤如下:对于指针算术,使用其所对应的数组元素区域,进行相应的下标计算,获得新的数组元素区域作为指针算术的结果;对于指针解引用,计算指针表达式对应的区域,然后获得该区域对应的值;对于取地址;计算被取地址的表达式对应的区域,以该区域作为取地址运算得到的指针值。
赋值表达式中赋值操作步骤如下:第一步,找到被赋值的表达式所对应的内存区域;第二步,给它所对应的内存区域映射被赋予的值。
与现有的技术相比,本发明具有如下有益效果:
1、本发明基于区域的内存建模方法可以精确的表示每个C语言表达式对应的内存位置,区分不同的表达式对应的不同内存位置。在区域建模方法下,每个表达式对应的内存位置是唯一的。从而完美地解决了C语言中别名问题,为代码缺陷分析提供了强有力的基础设施。
2、本发明可以精确的表示指针变量的值,也可以精确的表示数组变量和数组元素的关系,从而精确的表示这种复杂的内存结构,根据第一映射和第二个映射进行对各种表达式的求值,使得我们可以精确的求得任意复杂的表达式的值,完成对表达式进行精确的求值操作。
3、本发明不仅能够对指针进行精确的表示,而且能够对指针类型转换进行精确的表示,这也是代码检测工具需要的重要信息,从而解决C程序中大量的指针类型转换问题。
本发明基于区域的内存建模方法可以精确的表示指针变量的值、数组变量和数组元素的关系、指针类型转换等这些复杂的内存结构,也就是说可以精确的表示程序中每个表达式的值,对表达式进行精确的求值,从而可以对程序进行多种缺陷分析。
附图说明
图1和图2:基于区域的内存建模方法中实施例的示意图。
具体实施方式
本发明提供源代码缺陷分析中一种基于区域的内存建模方法,根据这个基于区域的内存建模方法得到的模型是为整个源代码缺陷分析服务的,当别的模块需要这个功能时,就调用这个模型,
基于区域的内存建模方法包括下列(1)、(2)和(3)三大操作步骤:
(1)从表达式到其所对应的内存区域建立第一个映射,步骤(1)的方法具体分为两步:
第一步,根据表达式中数据的种类建立对应的内存区域:所述建立对应的内存区域,包括下列操作步骤:对于变量,创建与其对应的变量区域,所述变量区域包括全局变量区域和局部变量区域;或者,对于数组元素,以该数组的变量区域以及该元素的下标为特征,创建数组元素区域;或者,对于结构体的域,以该结构体的区域以及域的名字为特征,创建结构体域区域;或者,对于字符串常量,建立字符串区域;或者,对于动态分配的内存区域对应的区域为符号区域。
第二步,根据不同内存区域之间关系建立区域模型:所述建立区域模型的步骤如下:区域模型含有三个基础区域分别为栈区域、堆区域和全局存储区域,分别对应于C程序的栈、堆和全局存储;局部变量区域的父区域为栈区域;全局变量区域的父区域是全局存储区域;数组元素区域的父区域为该数组对应的区域;结构体域区域的父区域为该结构体对应的区域;字符串区域的父区域为全局存储区域;符号区域的父区域为堆区域。
(2)判断是否含有赋值操作:是,执行步骤(3);否,执行步骤(1);
(3)从内存区域到其对应的值建立第二个映射,步骤(3)的方法采用数据结构实现第二个映射,所述数据结构实现第二个映射是根据数据元素间关系的不同特性采用下列四类结构:集合结构、线性结构、树型结构或者图形结构。
完成步骤(1)至步骤(3)后,根据所述第一个映射和第二个映射进行对各种表达式的求值,步骤如下:第一步,由表达式得到该表达式对应的唯一的内存区域;第二步,由该内存区域得到该表达式的值。使得我们可以精确的求得任意复杂的表达式的值。
C语言将表达式分为二大类:左值表达式和右值表达式。一个表达式如果代表一个内存区域,则称为左值表达式。不对应内存区域的为右值表达式。对于C语言中的每个左值表达式,计算其值的过程为,首先计算它的左值,也就是它所对应的唯一的内存区域,然后通过该内存区域,获得该区域对应的值,作为该表达式的右值。在这个区域模型之下,可以进行对表达式的各种求值:包括普通变量求值,指针算术,指针解引用,取地址等等。在求值中,把得到的值分为二大类,一类为非指针值,包括整数和浮点数,另一类为指针值,在分析中,我们使用内存区域来表示求值后的指针值,这是一种很直接的表示。
具体的说,本发明对于含有指针操作的表达式求值的步骤如下:对于指针算术,使用其所对应的数组元素区域,进行相应的下标计算,获得新的数组元素区域作为指针算术的结果;对于指针解引用,计算指针表达式对应的区域,然后获得该区域对应的值;对于取地址;计算被取地址的表达式对应的区域,以该区域作为取地址运算得到的指针值。
例如对于代码:
int x,*p;
x=3;
p=&x;
x的值为3,p的值是一个指向x的指针,我们用x对应的变量区域来表示这个指针值。
例如对于代码:
int a[10];
int*p;
p=a;
p++;
*p=3;
本发明的基于区域的内存模型就可以精确的表示这样的程序,其中p的值在一开始是a的第0个元素区域。指针算术在我们的模型中用元素区域的下标算术表示,下标0增加1后得到1,于是p后来指向a的第1个元素区域。*p=3;则给该区域赋值为3。整个语义过程被精确的模拟下来。
用一个例子来说明区域内存建模技术。例如对于代码片段:
   void f(){
  struct s{
     int x;
     int z[2];
  }d;
  int*p=malloc(10)
}
如图1和图2,我们得到的基于区域的内存建模可以用图1和图2表示,
图中,每个方框代表一个内存区域,箭头指向的是父区域。方框中的表达式代表对应该区域的左值表达式。Stack和Heap是两个基础区域,分别代表C程序的栈和堆存储区。d和p都是局部变量,所以它们对应的区域的父区域均为Stack。MallocBlock代表的是malloc()分配的区域,在堆上,所以父区域为Heap。d.x和d.z是结构体的域区域。d.z[0]和d.z[1]是两个数组元素区域。p0]和p[1]代表的是动态分配的数组元素。
由于程序中的赋值语句,会改变存储的状态,所以为了模拟赋值语句的效果,就建立从内存区域到它们被赋予的值的映射,即采用步骤(1)至步骤(3)的内存建模方法。把被赋值的区域映射到它的值,这是根据被分析的程序做的动作,如果没有区域被赋值,那么就不存在第二个映射。所以,只有通过步骤(1)、步骤(2)和步骤(3)组合起来,这样就可以精确的求出一个指针变量指向的区域,不需要额外的别名分析,就可以解决指针别名的问题,才能精确表示程序中每个表达式的值,从而可以对程序多种缺陷分析同时(缺陷包括:数组访问越界,空指针解引用等),本发明对于赋值表达式中赋值操作步骤如下(其优点是可以对任意复杂的表达式进行精确赋值):第一步,找到被赋值的表达式所对应的内存区域;第二步,给它所对应的内存区域映射被赋予的值。
本发明的内存建模方法对于指针类型转换也能够进行精确的描述,指针类型转换是C语言本身的操作的一种,如果代码中使用了这种操作,被测对象要求模型支持对其建立内存模型,那么就得去模拟这种操作即对指针类型转换的操作过程建立内存建模,这也是代码检测工具需要的重要信息。对于指针类型转换,使用如下的规则:对于相容类型的转换,如const到非const的转化,返回原来的区域值;对于到void*的指针转换,返回原来的区域值;对于到一般类型指针的转换,建立一个新的数组元素区域(下标为0),返回该区域。
最后应当说明的是:以上实施例仅用以说明本发明的技术方案而非对其限制,尽管参照上述实施例对本发明进行了详细的说明,所属领域的普通技术人员应当理解:依然可以对本发明的具体实施方式进行修改或者等同替换,而未脱离本发明精神和范围的任何修改或者等同替换,其均应涵盖在本发明的权利要求范围当中。

Claims (10)

1.源代码缺陷分析中基于区域的内存建模方法,其特征在于:包括下列操作步骤:
(1)从表达式到其所对应的内存区域建立第一个映射;
(2)判断是否含有赋值操作:
是,执行步骤(3);
否,执行步骤(1);
(3)从内存区域到其对应的值建立第二个映射。
2.根据权利要求1所述的方法,其特征在于:所述步骤(1)的方法为根据表达式中数据的种类建立对应的内存区域。
3.根据权利要求2所述的方法,其特征在于:所述步骤(1)的方法还包括根据不同内存区域之间关系建立区域模型。
4.根据权利要求3所述的方法,其特征在于:所述步骤(3)的方法采用数据结构实现第二个映射。
5.根据权利要求4所述的方法,其特征在于:所述建立对应的内存区域,包括下列操作步骤:
对于变量,创建与其对应的变量区域,所述变量区域包括全局变量区域和局部变量区域;
或者,对于数组元素,以该数组的变量区域以及该元素的下标为特征,创建数组元素区域;
或者,对于结构体的域,以该结构体的区域以及域的名字为特征,创建结构体域区域;
或者,对于字符串常量,建立字符串区域;
或者,对于动态分配的内存区域对应的区域为符号区域。
6.根据权利要求5所述的方法,其特征在于:建立区域模型的步骤如下;区域模型含有三个基础区域分别为栈区域、堆区域和全局存储区域,分别对应于C程序的栈、堆和全局存储;局部变量区域的父区域为栈区域;全局变量区域的父区域是全局存储区域;数组元素区域的父区域为该数组对应的区域;结构体域区域的父区域为该结构体对应的区域;字符串区域的父区域为全局存储区域;符号区域的父区域为堆区域。
7.根据权利要求6所述的方法,其特征在于:所述数据结构实现第二个映射是根据数据元素间关系的不同特性采用下列四类结构:集合结构、线性结构、树型结构或者图形结构。
8.根据权利要求4所述的方法,其特征在于:根据所述第一个映射和第二个映射进行对各种表达式的求值,步骤如下:
第一步,由表达式得到该表达式对应的唯一的内存区域;
第二步,由该内存区域得到该表达式的值。
9.根据权利要求8所述的方法,其特征在于:含有指针操作的表达式求值的步骤如下:
对于指针算术,使用其所对应的数组元素区域,进行相应的下标计算,获得新的数组元素区域作为指针算术的结果;
对于指针解引用,计算指针表达式对应的区域,然后获得该区域对应的值;
对于取地址;计算被取地址的表达式对应的区域,以该区域作为取地址运算得到的指针值。
10.根据权利要求4所述的方法,其特征在于:赋值表达式中赋值操作步骤如下:
第一步,找到被赋值的表达式所对应的内存区域;
第二步,给它所对应的内存区域映射被赋予的值。
CN2010101033714A 2010-02-01 2010-02-01 源代码缺陷分析中一种基于区域的内存建模方法 Pending CN101937390A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN2010101033714A CN101937390A (zh) 2010-02-01 2010-02-01 源代码缺陷分析中一种基于区域的内存建模方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN2010101033714A CN101937390A (zh) 2010-02-01 2010-02-01 源代码缺陷分析中一种基于区域的内存建模方法

Publications (1)

Publication Number Publication Date
CN101937390A true CN101937390A (zh) 2011-01-05

Family

ID=43390730

Family Applications (1)

Application Number Title Priority Date Filing Date
CN2010101033714A Pending CN101937390A (zh) 2010-02-01 2010-02-01 源代码缺陷分析中一种基于区域的内存建模方法

Country Status (1)

Country Link
CN (1) CN101937390A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112100059A (zh) * 2020-08-20 2020-12-18 浙江大学 一种c语言的指针类型分析方法

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112100059A (zh) * 2020-08-20 2020-12-18 浙江大学 一种c语言的指针类型分析方法
CN112100059B (zh) * 2020-08-20 2021-09-14 浙江大学 一种c语言的指针类型分析方法
WO2022036783A1 (zh) * 2020-08-20 2022-02-24 浙江大学 一种c语言的指针类型分析方法

Similar Documents

Publication Publication Date Title
CN109144882B (zh) 一种基于程序不变量的软件故障定位方法及装置
CN101739339B (zh) 一种基于程序动态依赖关系的软件故障定位方法
CN103019933B (zh) 测试用例覆盖度自动识别方法及装置
US20080244536A1 (en) Evaluating static analysis results using code instrumentation
CN106528399A (zh) 一种测试用例确定方法及装置
CN101369249A (zh) 标识软件的gui部件的方法和装置
CN101866317A (zh) 一种基于聚类分析的回归测试用例选择方法
CN103294596A (zh) 一种基于程序不变量的合约式软件故障预警方法
CN106354630A (zh) 一种基于动态符号执行的软件缺陷检测方法
CN105808369A (zh) 一种基于符号执行的内存泄漏检测方法
US20090222825A1 (en) Data race detection in a concurrent processing environment
CN105159827A (zh) 一种面向gui软件的可靠性加速测试方法
CN107045477A (zh) 一种可进行多维度检测的质量评估平台
CN105808438A (zh) 一种基于函数调用路径的测试用例复用方法
CN104156311A (zh) 一种基于cpu模拟器的嵌入式c语言目标码级单元测试方法
CN102087629A (zh) 一种基于Agent嵌入式软件的不变量测试方法与工具
CN101710303B (zh) 基于流敏感上下文敏感指向图的内存泄漏检测方法
CN102681932B (zh) 一种检测软件异常输入处理正确性的方法
CN105630678B (zh) 一种智能电能表软件的可靠性检测仪及其检测方法
CN1129070C (zh) 程序设计中内存操作错误的识别方法
CN106681851A (zh) 程序代码级内存缺陷漏报分析及解决方法
US8996922B2 (en) Mixed numeric and string constraint analysis
CN102023923B (zh) 一种基于别名分析技术的软件测试方法
CN101551773B (zh) 符号错误和赋值截断的二进制漏洞检测定位装置
CN103914382B (zh) 一种充分识别指针引用检测对象的方法

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
ASS Succession or assignment of patent right

Owner name: ZHANG

Free format text: FORMER OWNER: XU ZHONGXING

Effective date: 20111103

Free format text: FORMER OWNER: ZHANG JIAN BEIJING CODETEST INFORMATION TECHNOLOGY CO., LTD.

C41 Transfer of patent application or patent right or utility model
COR Change of bibliographic data

Free format text: CORRECT: ADDRESS; FROM: 100190 HAIDIAN, BEIJING TO: 100085 HAIDIAN, BEIJING

TA01 Transfer of patent application right

Effective date of registration: 20111103

Address after: 100085 Beijing city Haidian District Anning Zhuang three No. 9 Building 1 layer 2 5 unit 208

Applicant after: Zhang Yan

Address before: 100190 State Key Laboratory of computer science, Institute of software, Chinese Academy of Sciences, 4 South four street, Beijing, Haidian District, Zhongguancun

Applicant before: Xu Zhongxing

Co-applicant before: Zhang Jian

Co-applicant before: Beijing Codetest Information Technology Co., Ltd.

C12 Rejection of a patent application after its publication
RJ01 Rejection of invention patent application after publication

Application publication date: 20110105