CN103914382B - 一种充分识别指针引用检测对象的方法 - Google Patents

一种充分识别指针引用检测对象的方法 Download PDF

Info

Publication number
CN103914382B
CN103914382B CN201410115369.7A CN201410115369A CN103914382B CN 103914382 B CN103914382 B CN 103914382B CN 201410115369 A CN201410115369 A CN 201410115369A CN 103914382 B CN103914382 B CN 103914382B
Authority
CN
China
Prior art keywords
pointer
function
cited
variable
identifies
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.)
Expired - Fee Related
Application number
CN201410115369.7A
Other languages
English (en)
Other versions
CN103914382A (zh
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.)
Beijing University of Posts and Telecommunications
Original Assignee
Beijing University of Posts and Telecommunications
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 University of Posts and Telecommunications filed Critical Beijing University of Posts and Telecommunications
Priority to CN201410115369.7A priority Critical patent/CN103914382B/zh
Publication of CN103914382A publication Critical patent/CN103914382A/zh
Application granted granted Critical
Publication of CN103914382B publication Critical patent/CN103914382B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Machine Translation (AREA)

Abstract

本发明涉及一种充分识别指针引用检测对象的方法,包括:对被分析函数进行词法分析和语法分析,生成被分析函数的抽象语法树;从所述抽象语法树上识别所述被分析函数内的指针引用表达式,根据所述指针引用表达式识别出被引用指针,并将被引用指针添加到被引用指针集合中;从所述抽象语法树上识别所述被分析函数内的函数调用,根据被调用函数的函数摘要的空指针引用前置约束识别出在调用点处的被引用指针,并将被引用指针添加到被引用指针集合中;如果存在未判断是不是指针引用检测对象的指针,识别出被其引用的外部指针,并将所述外部指针添加到被调用函数的函数摘要的空指针引用前置约束中,进一步提高了空指针引用缺陷检测的精度。

Description

一种充分识别指针引用检测对象的方法
技术领域
本发明涉及软件静态分析技术领域,尤其涉及一种充分识别指针引用检测对象的方法。
背景技术
静态分析是软件测试方法的一种类型,其目的是通过静态的分析软件是否遵守预定的要求,是保证软件质量的重要一环。静态分析也被称为静态测试,不实际运行被测的软件,而是扫描源程序,从中找出可能导致错误的结构异常、控制流异常及数据流异常等情况。
基于静态分析的缺陷检测通过判定静态分析结果是否在语法或语义符合预订的要求,空指针引用是软件中常见的一类缺陷,按照被引用指针的作用域,空指针引用检测分为过程内空指针引用检测与过程间空指针引用检测。因为C程序语法上的灵活性,导致难以识别全部的指针引用表达式及被引用的指针;因为复合类型参数及多级指针参数的使用,导致过程间空指针缺陷检测难以充分识别全部被过程间引用的指针。
对空指针引用的充分检测建立在指针引用检测对象的充分识别上,指针引用检测对象识别不充分将必然导致空指针引用检测的漏报。
发明内容
(一)要解决的技术问题
本发明所要解决的技术问题是:如何充分识别指针引用检测对象,提高空指针引用缺陷检测的精度。
(二)技术方案
为此目的,本发明提出了一种充分识别指针引用检测对象的方法,包括以下步骤:
S101对被分析函数进行词法分析和语法分析,生成被分析函数的抽象语法树;
S102从所述抽象语法树上识别所述被分析函数内的指针引用表达式,根据所述指针引用表达式识别出被引用指针,并将被引用指针添加到被引用指针集合中;
S103从所述抽象语法树上识别所述被分析函数内的函数调用,根据被调用函数的函数摘要的空指针引用前置约束识别出在调用点处的被引用指针,并将被引用指针添加到被引用指针集合中;
S104判断所述被引用指针集合中是否还有未判断是不是指针引用检测对象的指针,如果有,则转步骤S105;否则,转步骤S106;
S105识别出被所述未判断是不是指针引用检测对象的指针引用的外部指针,并将所述外部指针添加到被调用函数的函数摘要的空指针引用前置约束中,转步骤S104;
S106识别结束。
优选地,所述步骤S102从所述抽象语法树上识别所述被分析函数内的指针引用表达式,根据所述指针引用表达式识别出被引用指针,并将被引用指针添加到被引用指针集合中具体包括:
根据所述指针引用表达式的语法规则,从所述抽象语法树的相应节点上识别出所述被分析函数内的全部指针引用表达式;
对每一个识别出的指针引用表达式,根据所述指针引用表达式的类型,识别出被引用的指针变量,并将被引用的指针变量添加到被引用指针集合中。
优选地,所述步骤S103从所述抽象语法树上识别所述被分析函数内的函数调用,根据被调用函数的函数摘要的空指针引用前置约束识别出在调用点处的被引用指针,并将被引用指针添加到被引用指针集合中具体包括:
根据函数调用表达式与抽象语法树节点的对应规则,从所述抽象语法树上识别出被分析函数所调用的全部函数;
对每一个被调用函数,获取其函数摘要的空指针引用前置约束,根据所述空指针引用前置约束获取所述被调用函数中全部被约束为不能为空的指针;
对于每一个被约束为不能为空的指针,根据函数调用点处形参与实参的对应关系获取每一个被约束为不能为空的指针对应的调用点处的指针变量集合,并将所述指针变量集合中的所有指针添加到被引用指针集合中。
优选地,所述根据函数调用点处形参与实参的对应关系获取每一个被约束为不能为空的指针对应的调用点处的指针变量集合具体包括:
获取每一个被约束不能为空的指针变量的父变量列表,并按父子层次排序;
获取排序后列表顶层父变量对应的实参;
根据父变量列表中的变量对应的指针引用表达式类型,基于顶层父变量对应的实参在调用点处获取其对应的指针变量。
优选地,所述步骤S105识别出被所述未判断是不是指针引用检测对象的指针引用的外部指针,并将所述外部指针添加到被调用函数的函数摘要的空指针引用前置约束中具体包括:
从被引用指针集合中选取未判定是不是指针引用检测对象的指针,作为待判定指针;
基于数据流分析的结果,在所述待判定指针被引用的程序点分析获取其指向属性,如果指向属性是确定的,则识别出被所述待判定指针引用的外部指针,并将所述外部指针添加到指针引用检测对象集合中;否则,将所述外部指针添加到被调用函数的函数摘要的空指针引用前置约束中。
优选地,所述识别出被所述待判定指针引用的外部指针具体包括:
根据所述数据流分析的结果在所述待判定指针被引用的程序点获取该指针的取值区间,并从所述取值区间获取所述待判定指针的指向集合;
对指向集合中的每个未知区域,获取所述未知区域对应变量的父变量,所述父变量为所述待判定指针引用的外部指针。
优选地,所述方法还包括:
根据所述抽象语法树生成反应所述被分析函数控制结构的控制流图;
根据所述控制流图生成所述被调用函数的函数摘要。
(三)有益效果
本发明公开了一种充分识别指针引用检测对象的方法,该方法能够识别出各种语法形式的被引用指针以及因函数调用引起的过程间被引用指针,识别的结果可作为空指针引用缺陷充分检测的基础,进而提高空指针引用缺陷检测的精度,降低空指针引用检测的漏报。
附图说明
通过参考附图会更加清楚的理解本发明的特征和优点,附图是示意性的而不应理解为对本发明进行任何限制,在附图中:
图1是本发明一种充分识别指针引用检测对象的方法的流程图;
图2是本发明实施例中基于抽象语法树上识别出指针引用表达式的流程图;
图3是本发明实施例中识别指针引用表达中出被引用指针变量的流程图;
图4是本发明实施例中形参到实参的映射运算的流程图;
图5是本发明实施例中形参及其按父子关系排序的父变量集合的运算流程图;
图6是本发明实施例中获得形参对应的实参的流程图;
图7是本发明实施例中识别被引用的外部指针的流程图。
具体实施方式
下面将结合附图对本发明的实施例进行详细描述。
本发明提出了一种充分识别指针引用检测对象的方法,应用本发明的指针引用检测对象识别方法,能够保证指针引用检测对象识别的充分性。
本发明实施例一提出了一种充分识别指针引用检测对象的方法,如图1所示,包括以下步骤:
S101对被分析函数进行词法分析和语法分析,生成被分析函数的抽象语法树;
S102从所述抽象语法树上识别所述被分析函数内的指针引用表达式,根据所述指针引用表达式识别出被引用指针,并将被引用指针添加到被引用指针集合中;
S103从所述抽象语法树上识别所述被分析函数内的函数调用,根据被调用函数的函数摘要的空指针引用前置约束识别出在调用点处的被引用指针,并将被引用指针添加到被引用指针集合中;
S104判断所述被引用指针集合中是否还有未判断是不是指针引用检测对象的指针,如果有,则转步骤S105;否则,转步骤S106;
S105识别出被所述未判断是不是指针引用检测对象的指针引用的外部指针,并将所述外部指针添加到被调用函数的函数摘要的空指针引用前置约束中,转步骤S104;
S106识别结束。
本发明描述指针变量取值及其关联准确全面,对被分析C程序进行语法分析得到其抽象语法树,其中抽象语法树的节点与C程序的代码对应映射关联。C语言中的指针引用表达式可归纳为*exp、exp->f,exp[i],每个指针引用表达式均对应着抽象语法树上的一棵子树,遍历抽象语法树获得所有的这类子树,根据C语言的语法规则识别出该类子树对应的指针引用表达式,并识别出被引用的指针。应用RSTVL描述变量的取值,其中RSTVL为一个四元组<Var,Region,SExp,Domain>。其中:Var表示内存对象;Region表示区域,用来模拟变量实际运行时所分配的实际内存区域;SExp表示符号表达式,符号表达式由符号与数值通过数学运算与逻辑运算构成;Domain表示取值区间,其中指针类型的区间PointerDomain的指向集合为可能指向的变量对应的区域编号的集合。应用RSTVL及能表示变量的取值,又能表示变量间的别名关系、复合数据类型变量与其成员间的层次关系、基本类型变量的取值的逻辑关联关系;即RSTVL能够表示程序运行时的内存对象间的所有可能关联。
本发明实施例中指针引用检测对象的充分识别是在基于RSTVL的数据流分析结果的基础上进行的。本实施例中的RSTVL适用于流敏感、域敏感、上下文敏感、路径不敏感的数据流分析,RSTVL将内存划分为离散的区域,能够描述区域间的指向关系、层次关系以及取值的逻辑关联.基于RSTVL的区域抽象包括:
(1)对每个程序点l,集合Rl模拟在l处能够被访问的区域集合,集合Sl表示在l处使用的符号集合。
(2)对每个程序点l,有一个抽象存储:其中:
映射一个内存对象到一个区域;
表示区域间的指向关系;
映射一个复合结构变量的成员到一个区域。
对可寻址表达式的各种访存操作,都首先需要获得所对应的区域。定义Rl[[e]]表示在程序点l上,抽象存储ρ中,可寻址表达式e对应的区域集合。下面给出获得各种类型的可寻址表达式对应的区域的策略:
R l [ [ v ] ] = &rho; v l ( v ) ;
R l [ [ e . f ] ] = &cup; r &Element; R l [ e ] &rho; f l ( r , f ) ;
R l [ [ e [ i ] ] ] = &cup; r &Element; R l [ e ] &rho; f l ( r , i ) ;
R l [ [ * e ] ] = &cup; r &Element; R l [ e ] &rho; r l ( r ) ;
R l [ [ ( e ) ] ] = R l [ [ e ] ] ;
R l [ [ e - > f ] ] = &cup; r &Element; R l [ e ] ( &cup; r &prime; &Element; &rho; r l ( r ) &rho; f l ( r &prime; , f ) ) .
其中可寻址表达式e.f的父变量为e,可寻址表达式e[i]的父变量为e,可寻址表达式*e的父变量为e,可寻址表达式e->f的父变量为e。可寻址表达式(e)等价于e。
为了能使不同调用点的指针指向信息方便地映射到被调函数上,引入扩充变量来抽象地表示指针类型的形参和全局指针表达式的指向信息。扩充变量的引入规则为:(1)对于n级指针p,扩充出*p、**p、***p、…等共n个变量;(2)对于结构体s,如果对应的结构体类型有f1、f2、…、fn共n个成员,则扩充出s.f1、s.f2、…、s.fn共n个变量。
对C语言所支持的*exp、exp->f、exp[i]三类指针引用表达式,可以从被测程序的抽象语法树上识别出,并识别处被引用的指针,基于数据流分析的结果,在指针引用所在的程序点获得该指针的指向属性,如果指向属性为UNKNOWN,则将该指针所指向的外部变量的父变量约束为不能为空指针,并添加到所在函数函数摘要的空指针引用前置约束中。
基于RSTVL的数据流分析可以得到每个程序点上活跃变量的存储状态的上近似,其中指针变量的取值为描述指针指向集合的指针类型的区间PointerDomain,指向集合的元素为指针所可能指向的变量对应区域的区域编号。根据指针所指向的区域的不同,可定义指针的指向属性为一个格,元素包括EMPTY、NULL、NOTNULL、NULL_OR_NOTNULL,如果指向属性不确定,用UNKNOWN标识,根据指针变量的PointerDomain,可以可靠的获得其指向属性。
例如,下面的代码片断:
对于函数f,首先进行过程内分析,在函数入口处,对参数pst生成扩充变量,其中pst生成扩充变量*pst、(*pst).f、*(*pst).f。
对于函数f对应的抽象语法树的子树,搜索与*exp、exp->f、exp[i]三类指针引用表达式对应抽象语法树节点一致的节点,并解析抽象语法树节点,可识别出两个指针引用表达式,S7处的pst->f、S8处的*p,被解引用的指针分别为pst、p。
根据基于RSTVL的数据流分析的结果可知,在S7处pst的指向属性为NOTNULL,在S8处p的指向属性为UNKNOWN,p所指向的变量为扩充变量*(*pst).f,则将*(*pst).f的父变量(*pst).f不能为空添加到函数f的函数摘要空指针引用前置约束中。函数f的函数摘要的空指针引用前置约束集合为{(*pst).f}。
对于函数f,没有调用其它函数,因此函数f的指针引用检测对象集合为{<pst,S7>},其中<pst,S7>表示指针pst在程序点S7处被引用,需要进行检测。
对于函数g,不需要为外部变量生成扩充变量。
对于函数g对应的抽象语法树的子树,搜索与*exp、exp->f、exp[i]三类指针引用表达式对应抽象语法树节点一致的节点,并解析抽象语法树节点,可识别出两个指针引用表达式,S17处的qst->f、S19处的qst->f,被解引用的指针分均为ps。
根据基于RSTVL的数据流分析的结果可知,在S17处与S19处qst的指向属性均为NOTNULL,则将<qst,S17>、<qst,S19>添加到函数g的指针引用检测对象集合中。
对于函数g,在函数S20处调用了函数f,并且函数f函数摘要的空指针引用前置约束集合为{(*pst).f}。(*pst).f的父变量集合为{pst、*pst、(*pst).f},基于顶级形参与顶级实参的对应关系,可知pst对应着qst;*pst的父变量为pst,pst与*pst是属于指向关系引起的父子关系,基于数据流分析的结果,qst的指向的变量集合为{s},即*pst对应着S20调用点处的变量集合{s};(*pst).f的父变量为*pst,*pst与(*pst).f是复合数据类型与其成员的层次关系引起的父子关系,*pst对应的单例集{s}中元素s的成员f对应的可寻址表达式为s.f,则(*pst).f对应着S20调用点处的变量集合{s.f}。在S20处,s.f与qst->f具有别名关系,其指向属性为NULL_OR_NOTNULL,则将<s.f,S20>添加到函数g的指针引用检测对象集合中。
函数g的指针引用检测对象集合为{<qst,S17>、<qst,S19>、<s.f,S20>}。
优选地,所述步骤S102从所述抽象语法树上识别所述被分析函数内的指针引用表达式,根据所述指针引用表达式识别出被引用指针,并将被引用指针添加到被引用指针集合中具体包括:
根据所述指针引用表达式的语法规则,从所述抽象语法树的相应节点上识别出所述被分析函数内的全部指针引用表达式;
对每一个识别出的指针引用表达式,根据所述指针引用表达式的类型,识别出被引用的指针变量,并将被引用的指针变量添加到被引用指针集合中。
其中,步骤从所述抽象语法树的相应节点上识别出所述被分析函数内的全部指针引用表达式的流程如图2所示,具体包括以下步骤:
步骤A1从抽象语法树上查询符合*exp语法的节点;
步骤A2对每一个符合*exp语法的节点,识别出指针引用表达式*exp;
步骤A3从抽象语法树上查询符合exp->f语法的节点;
步骤A4对每一个符合exp->f语法的节点,识别出指针引用表达式exp->f;
步骤A5从抽象语法树上查询符合exp[i]语法的节点;
步骤A6对每一个符合exp[i]语法的节点,识别出指针引用表达式exp[i];
其中,步骤根据所述指针引用表达式的类型,识别出被引用的指针变量,并将被引用的指针变量添加到被引用指针集合中的流程如图3所示,具体包括以下步骤:
步骤B1如果还有未被识别被引用指针的指针引用表达式,转步骤B2,否则转步骤B9;
步骤B2取一个未识别被引用指针的指针引用表达式;
步骤B3如果指针引用表达式符合*exp语法,转步骤B4,否则转步骤B5;
步骤B4基于*exp语法规则,识别出被引用指针exp,转步骤B8;
步骤B5如果指针引用表达式符合exp->f语法,转步骤B6,否则转步骤B7;
步骤B6基于exp->f语法规则,识别出被引用指针exp,转步骤B8;
步骤B7基于exp[i]语法规则,识别出被引用指针exp;
步骤B8将识别出的被引用指针exp添加到被引用指针集合中,转步骤B1;
步骤B9识别结束。
优选地,所述步骤S103从所述抽象语法树上识别所述被分析函数内的函数调用,根据被调用函数的函数摘要的空指针引用前置约束识别出在调用点处的被引用指针,并将被引用指针添加到被引用指针集合中具体包括:
根据函数调用表达式与抽象语法树节点的对应规则,从所述抽象语法树上识别出被分析函数所调用的全部函数;
对每一个被调用函数,获取其函数摘要的空指针引用前置约束,根据所述空指针引用前置约束获取所述被调用函数中全部被约束为不能为空的指针;
对于每一个被约束为不能为空的指针,根据函数调用点处形参与实参的对应关系获取每一个被约束为不能为空的指针对应的调用点处的指针变量集合,并将所述指针变量集合中的所有指针添加到被引用指针集合中。
其中,步骤根据函数调用点处形参与实参的对应关系获取每一个被约束为不能为空的指针对应的调用点处的指针变量集合的流程如图4所示,具体包括以下步骤:
步骤E1对于被约束不能为空指针的指针类型形参,运算对应的直接父变量与间接父变量,并对这些父变量按照父子关系排序得到父变量集合;
步骤E2判断父变量集合中的形参变量是否还有形参,如果有,则转步骤E3;否则,转步骤E9;
步骤E3基于形参实参映射集合判断该形参是否已被分析分析获得了对应的实参,如果是,则转步骤E4;否则,转步骤E2;
步骤E4判断该形参变量是否有父变量,如果有,则转步骤E5;否则,转步骤E7;
步骤E5从形参实参映射集合中获得该形参的父变量对应的实参;
步骤E6根据当前形参的表达式类型,基于父变量对应的实参获得当前形参对应的实参;
步骤E7根据形参是第几个形参的编号,获得对应编号的实参;
步骤E8将该形参对应的实参添加到形参实参映射集合中;
步骤E9结束。
其中,步骤E1所述的获得形参及其按父子关系排序的父变量集合的运算流程如图5所示,具体包括以下步骤:
步骤E11获得被分析的形参变量,作为待处理的变量;
步骤E12判断待处理的形参变量是否形如*.exp,如果是,转步骤E16;否则,转步骤E13;
步骤E13判断待处理的形参变量是否形如exp.f,如果是,转步骤E16;否则,转步骤E14;
步骤E14判断待处理的形参变量是否形如exp[i],如果是,转步骤E16;否则,转步骤E15;
步骤E15判断待处理的形参变量是否形如(exp),如果是,转步骤E16;否则,转步骤E17;
步骤E16将名为exp的变量添加到父变量集合,并将exp作为待处理变量;
步骤E17对父变量集合中的变量按照父子关系排序;
步骤E18获得父变量集合处理结束。
其中,步骤E6所述的根据当前形参的表达式类型,基于父变量对应的实参获得当前形参对应的实参的流程如图6所示,具体包括以下步骤:
步骤E61获得被分析的形参变量,作为待处理的变量;
步骤E62如果待处理的变量形如*.exp,则转步骤E63;否则,转步骤E64;
步骤E63基于获得待处理变量对应的抽象区域,转步骤E610;
步骤E64如果待处理的变量形如exp.f,则转步骤E65;否则,转步骤E66;
步骤E65基于获得待处理变量对应的抽象区域,转步骤E610;
步骤E66如果待处理的变量形如exp[i],则转步骤E67;否则,转步骤E68;
步骤E67基于获得待处理变量对应的抽象区域,转步骤E610;
步骤E68如果待处理的变量形如(exp),则转步骤E69;否则,转步骤E611;
步骤E69基于获得待处理变量对应的抽象区域,转步骤E610;
步骤E610获得运算得到的区域对应的变量;
步骤E611处理结束。
优选地,所述根据函数调用点处形参与实参的对应关系获取每一个被约束为不能为空的指针对应的调用点处的指针变量集合具体包括:
获取每一个被约束不能为空的指针变量的父变量列表,并按父子层次排序;
获取排序后列表顶层父变量对应的实参;
根据父变量列表中的变量对应的指针引用表达式类型,基于顶层父变量对应的实参在调用点处获取其对应的指针变量。
优选地,所述步骤S105识别出被所述未判断是不是指针引用检测对象的指针引用的外部指针,并将所述外部指针添加到被调用函数的函数摘要的空指针引用前置约束中具体包括:
从被引用指针集合中选取未判定是不是指针引用检测对象的指针,作为待判定指针;
基于数据流分析的结果,在所述待判定指针被引用的程序点分析获取其指向属性,如果指向属性是确定的,则识别出被所述待判定指针引用的外部指针,并将所述外部指针添加到指针引用检测对象集合中;否则,将所述外部指针添加到被调用函数的函数摘要的空指针引用前置约束中。
优选地,所述识别出被所述待判定指针引用的外部指针具体包括:
根据所述数据流分析的结果在所述待判定指针被引用的程序点获取该指针的取值区间,并从所述取值区间获取所述待判定指针的指向集合;
对指向集合中的每个未知区域,获取所述未知区域对应变量的父变量,所述父变量为所述待判定指针引用的外部指针。
其中,识别出被所述待判定指针引用的外部指针的流程如图7所示,具体包括以下步骤:
步骤J1基于数据流分析的结果,在指针被引用的程序点获得该指针的区间,并从其区间中获得指向集合;
步骤J2如果指针集合中还有未判定是否是未知区域的区域编号,转步骤J3,否则转步骤J9;
步骤J3从指向集合中选择一个未判定的区域编号;
步骤J4获得该区域编号所标识的区域;
步骤J5判定该区域是否为未知区域,如果是,转步骤J6,否则转步骤J2;
步骤J6获得该区域对应的变量;
步骤J7获得该变量的父变量;
步骤J8将该父变量添加到被引用的外部指针变量集合中;
步骤J9判定结束。
本发明实施例对每个被引用指针,在被引用的程序点上基于RSTVL获得其指向属性,如果指向属性不确定,则获得其指向集合,如果指向集合中的区域编号标识的区域为未知区域,则将该未知区与对应的内存对象为外部变量,将该外部变量的父变量添加到空指针引用前置约束中,因为RSTVL描述变量取值及其关联的准确全面能够保证基于RSTVL的数据流分析的可靠性,进而能够保证所约束指针的全面性。
优选地,所述方法还包括:
根据所述抽象语法树生成反应所述被分析函数控制结构的控制流图;
根据所述控制流图生成所述被调用函数的函数摘要。
基于RSTVL能够实现符号化的函数摘要,在函数调用点处通过对符号化函数摘要的实例化,能够获得空指针引用前置约束中指针与调用点处活跃变量的对应关系,进而能够准确的识别出过程间引用的指针。
本发明公开了一种充分识别指针引用检测对象的方法,该方法能够识别出各种语法形式的被引用指针以及因函数调用引起的过程间被引用指针,识别的结果可作为空指针引用缺陷充分检测的基础,进而提高空指针引用缺陷检测的精度,降低空指针引用检测的漏报。
以上所述仅为本发明的实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。

Claims (5)

1.一种识别指针引用检测对象的方法,其特征在于,包括以下步骤:
S101对被分析函数进行词法分析和语法分析,生成被分析函数的抽象语法树;
S102从所述抽象语法树上识别所述被分析函数内的指针引用表达式,根据所述指针引用表达式识别出被引用指针,并将被引用指针添加到被引用指针集合中;
S103从所述抽象语法树上识别所述被分析函数内的函数调用,根据被调用函数的函数摘要的空指针引用前置约束识别出在调用点处的被引用指针,并将被引用指针添加到被引用指针集合中;
S104判断所述被引用指针集合中是否还有未判断是不是指针引用检测对象的指针,如果有,则转步骤S105;否则,转步骤S106;
S105识别出被所述未判断是不是指针引用检测对象的指针引用的外部指针,并将所述外部指针添加到被调用函数的函数摘要的空指针引用前置约束中,转步骤S104;
S106识别结束;
所述步骤S105识别出被所述未判断是不是指针引用检测对象的指针引用的外部指针,并将所述外部指针添加到被调用函数的函数摘要的空指针引用前置约束中具体包括:
从被引用指针集合中选取未判定是不是指针引用检测对象的指针,作为待判定指针;
在所述待判定指针被引用的程序点分析获取其指向属性,如果指向属性是确定的,则识别出被所述待判定指针引用的外部指针,并将所述外部指针添加到指针引用检测对象集合中;否则,将所述外部指针添加到被调用函数的函数摘要的空指针引用前置约束中;
所述识别出被所述待判定指针引用的外部指针具体包括:
在所述待判定指针被引用的程序点获取该指针的取值区间,并从所述取值区间获取所述待判定指针的指向集合;
对指向集合中的每个未知区域,获取所述未知区域对应变量的父变量,所述父变量为所述待判定指针引用的外部指针。
2.根据权利要求1所述的方法,其特征在于,所述步骤S102从所述抽象语法树上识别所述被分析函数内的指针引用表达式,根据所述指针引用表达式识别出被引用指针,并将被引用指针添加到被引用指针集合中具体包括:
根据所述指针引用表达式的语法规则,从所述抽象语法树的相应节点上识别出所述被分析函数内的全部指针引用表达式;
对每一个识别出的指针引用表达式,根据所述指针引用表达式的类型,识别出被引用的指针变量,并将被引用的指针变量添加到被引用指针集合中。
3.根据权利要求1所述的方法,其特征在于,所述步骤S103从所述抽象语法树上识别所述被分析函数内的函数调用,根据被调用函数的函数摘要的空指针引用前置约束识别出在调用点处的被引用指针,并将被引用指针添加到被引用指针集合中具体包括:
根据函数调用表达式与抽象语法树节点的对应规则,从所述抽象语法树上识别出被分析函数所调用的全部函数;
对每一个被调用函数,获取其函数摘要的空指针引用前置约束,根据所述空指针引用前置约束获取所述被调用函数中全部被约束为不能为空的指针;
对于每一个被约束为不能为空的指针,根据函数调用点处形参与实参的对应关系获取每一个被约束为不能为空的指针对应的调用点处的指针变量集合,并将所述指针变量集合中的所有指针添加到被引用指针集合中。
4.根据权利要求3所述的方法,其特征在于,所述根据函数调用点处形参与实参的对应关系获取每一个被约束为不能为空的指针对应的调用点处的指针变量集合具体包括:
获取每一个被约束不能为空的指针变量的父变量列表,并按父子层次排序;
获取排序后列表顶层父变量对应的实参;
根据父变量列表中的变量对应的指针引用表达式类型,基于顶层父变量对应的实参在调用点处获取其对应的指针变量。
5.根据权利要求1-4任一权利要求所述的方法,其特征在于,所述方法还包括:
根据所述抽象语法树生成反应所述被分析函数控制结构的控制流图;
根据所述控制流图生成所述被调用函数的函数摘要。
CN201410115369.7A 2014-03-25 2014-03-25 一种充分识别指针引用检测对象的方法 Expired - Fee Related CN103914382B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201410115369.7A CN103914382B (zh) 2014-03-25 2014-03-25 一种充分识别指针引用检测对象的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201410115369.7A CN103914382B (zh) 2014-03-25 2014-03-25 一种充分识别指针引用检测对象的方法

Publications (2)

Publication Number Publication Date
CN103914382A CN103914382A (zh) 2014-07-09
CN103914382B true CN103914382B (zh) 2016-06-29

Family

ID=51040084

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201410115369.7A Expired - Fee Related CN103914382B (zh) 2014-03-25 2014-03-25 一种充分识别指针引用检测对象的方法

Country Status (1)

Country Link
CN (1) CN103914382B (zh)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105607990B (zh) * 2014-11-19 2019-07-05 腾讯科技(成都)有限公司 一种空指针崩溃的挖掘方法及装置
US10642584B2 (en) * 2017-09-01 2020-05-05 Shenzhen Qianhai Sourcebrella Inc. Ltd. Defect detection method, device, system and computer readable medium
CN111443916B (zh) * 2020-03-10 2021-06-22 南京航空航天大学 一种面向程序内存安全性验证工具的静态优化方法
CN112100059B (zh) * 2020-08-20 2021-09-14 浙江大学 一种c语言的指针类型分析方法

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102855183A (zh) * 2012-04-18 2013-01-02 清华大学 内层变量被外层指针引用错误静态检测方法及装置
CN103218296A (zh) * 2013-04-22 2013-07-24 北京邮电大学 一种充分检测空指针引用缺陷的方法

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102855183A (zh) * 2012-04-18 2013-01-02 清华大学 内层变量被外层指针引用错误静态检测方法及装置
CN103218296A (zh) * 2013-04-22 2013-07-24 北京邮电大学 一种充分检测空指针引用缺陷的方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
An Approach to Fully Recognizing Addressable Expression;Yukun Dong 等;《The 13th International Conference on Quality Software》;20130730;第149-152页 *

Also Published As

Publication number Publication date
CN103914382A (zh) 2014-07-09

Similar Documents

Publication Publication Date Title
US10901709B2 (en) Partitioning based migration of systems to container and microservice based platforms
CN103218296B (zh) 一种充分检测空指针引用缺陷的方法
CN103914382B (zh) 一种充分识别指针引用检测对象的方法
Shen et al. Efindbugs: Effective error ranking for findbugs
CN102073588B (zh) 一种基于代码静态分析的多线程死锁检测方法及系统
Tomas et al. Open source tools for measuring the Internal Quality of Java software products. A survey
CN102073587B (zh) 一种程序中不可达路径的静态检测方法
CN106649100A (zh) 一种自动化测试方法及系统
Tramontana Automatically characterising components with concerns and reducing tangling
WO2005055051A2 (en) Determining the possibility of adverse effects arising from a code change
CN108804326A (zh) 一种软件代码自动检测方法
CN103744776B (zh) 一种基于符号化函数摘要的静态分析方法及系统
Maisikeli et al. Aspect mining using self-organizing maps with method level dynamic software metrics as input vectors
CN102023923B (zh) 一种基于别名分析技术的软件测试方法
Kim et al. Assessing test set adequacy for object oriented programs using class mutation
CN106991050B (zh) 一种静态测试空指针引用缺陷假阳性识别方法
CN103559127A (zh) 一种缺陷处理方法及缺陷处理器
Eichinger et al. Software-defect localisation by mining dataflow-enabled call graphs
US9600245B2 (en) Computer-implemented method for generating control unit program code and message management environment relating thereto
US20020092001A1 (en) Record medium and method for analyzing a source file
JP2019537088A (ja) 自律サービス作業妥当性確認のためのシステムおよび方法
Bach et al. Determining method-call sequences for object creation in C++
Ali et al. Identification and Optimisation of Type-Level Model Queries
Duseau et al. Vasco: A visual approach to explore object churn in framework-intensive applications
Firdaus et al. Refused Bequest Code Smells Detection on Software Design

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20160629

CF01 Termination of patent right due to non-payment of annual fee