一种面向C程序顺序存储结构静态分析的抽象内存模型的制作方法

文档序号:19570823发布日期:2019-12-31 18:54阅读:161来源:国知局
一种面向C程序顺序存储结构静态分析的抽象内存模型的制作方法

本发明属于程序语义缺陷修复方法技术领域,更具体的说是涉及一种面向c程序顺序存储结构静态分析的抽象内存模型。



背景技术:

数据流分析一直是软件测试领域关注的重要问题。它是程序分析中的关键技术,通过分析程序状态信息在控制流图中的传播来计算每个静态程序点(语句)在运行时可能出现的状态。通过数据流分析,测试人员可以不必实际运行程序就能够发现程序运行时的行为。数据流分析结果可用于测试用例生成、缺陷检测等软件测试领域的重要工作。

数组、malloc动态分配后的连续内存等顺序存储结构在c程序中被大量使用,其结构的复杂性使得无法利用传统的数据流分析方法对其进行准确分析。传统的数据流分析方法基于分析和效率折中的考虑,没有对顺序存储结构进行建模;其次,在程序利用指针访问顺序存储结构时,大多数现有的数据流分析方法基本只维护了指针的指向信息,没有讨论指针在连续内存中可能发生偏移的数值性质,更未考虑发生偏移时可能存在越界的不安全问题。因此,对c语言中的顺序存储结构进行有效刻画与描述是数据流分析领域的难点。

因此,如何提供一种面向c程序顺序存储结构静态分析的抽象内存模型成为了本领域技术人员亟需解决的问题。



技术实现要素:

有鉴于此,本发明提供了一种面向c程序顺序存储结构静态分析的抽象内存模型,主要目的在于通过实现对顺序存储结构的抽象建模,归纳总结c程序中通过指针访问顺序存储结构的各种操作过程。

为了实现上述目的,本发明采用如下技术方案:

一种面向c程序顺序存储结构静态分析的抽象内存模型,包括以下几个步骤:

a、对顺序存储结构进行适用于数据流分析的建模,描述顺序存储结构在内存中的抽象表示及指向顺序存储结构的指针变量的指向区域与偏移;

b、定义通过指针访问顺序存储结构的迁移操作,提出安全范围判别保证操作安全性;

c、定义通过指针访问顺序存储结构的谓词操作。

优选的,所述步骤a对顺序存储结构进行适用于数据流分析的建模过程如下:

对于c程序中的一个变量p,当p为数组变量时,其模型表示为<var,region,domain>,此时取值区间为各数组元素区域信息,其中由某个数组元素索引与其对应区域构成;当p为指针变量时,domain={d1,d2,…,dn}为p指向区域与对应偏移的集合,其中di=<ptregion,offset>,ptregion为指针变量p指向的内存对象var对应区域,且offset是一个整型表达式,表示偏离指向基址的偏移量对应的整型区间。

优选的,所述步骤b中通过指针访问顺序存储结构的迁移操作的过程如下:

安全范围判别是指在执行迁移操作前,对指针变量指向区域偏移将发生的增大或缩小进行预先判定,若超出顺序存储结构的索引下界或上界,则提示outofbounds警告。

优选的,指针访问顺序存储结构的操作包括值访问与地址访问两种。

优选的,地址访问的迁移操作分析过程如下:

判断该操作是否是指针自加或自减操作,

若是,则确定自加或自减符号,根据变量只想区域与偏移确定后一个或前一个对象x;

若否,则判断是否为数组变量或指针变量或数组元素取地址与整型表达式的加减操作;若否,分析结束;若是,则确定整型表达式的值,根据数组变量或指针变量或数组元素取地址确定右端对象x;

判断对象x是否存在,

若不存在,则提示outofbounds警告后,分析结束;

若存在,则判断对象x是否已经抽象表示;若是,则左端更新符合表达式、基址、指向区域、偏移区间后,分析结束;若否,则先对对象x进行抽象建模,再左端更新符合表达式、基址、指向区域、偏移区间后,分析结束。

优选的,值访问的迁移操作分析过程如下:

判断该操作是否为指针引用顺序存储结构元素操作,

若否,则先确定指针变量当前指向区域对应对象,然后对指针变量指向对象的取值区间进行区间并操作,再将生成的新区间赋值给左端变量后,分析结束;

若是,则先确定指针变量当前指向区域与偏移,然后引用顺序存储结构元素x,再判断x是否存在;

若不存在,则提示outofbounds警告后,分析结束;

若存在,则判断x则判断对象x是否已经抽象表示;若是,则将生成的新区间赋值给左端变量后,分析结束;若否,则先对x进行抽象建模,再将生成的新区间赋值给左端变量后,分析结束。

优选的,谓词操作分析过程如下:

先确定关系符号左右两端对象x、y,再判断x、y是否都存在,

若否,则分析结束;

若是,则判断x、y是否存在共同基址,

若不存在,则分析结束;

若存在,则先取出满足两端存在共同基址的部分(m、n),对相应的指针变量进行指向区域和偏移区间的更新,再判断m、n的偏移区间是否全部或部分满足关系;

若否,则分析结束;

若是,则取出此时指针变量对应的指向区域与偏移区间后,分析结束。

本发明的有益效果在于:

本发明的抽象内存模型相比现有的大多数抽象内存模型,可实现对顺序存储结构上发生偏移的性质进行有效刻画,同时通过定义的迁移操作及谓词操作可准确描述指针访问顺序存储结构的过程,并保证操作的安全性。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。

图1附图为本发明的地址访问迁移操作过程示意图。

图2附图为本发明的值访问迁移操作过程示意图。

图3附图为本发明的谓词操作过程示意图。

图4附图为本发明的顺序存储结构示意图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

请参阅附图1-4,本发明提供了一种面向c程序顺序存储结构静态分析的抽象内存模型,包括以下几个步骤:

a、对顺序存储结构进行适用于数据流分析的建模,描述顺序存储结构在内存中的抽象表示及指向顺序存储结构的指针变量的指向区域与偏移;

b、定义通过指针访问顺序存储结构的迁移操作,提出安全范围判别保证操作安全性;

c、定义通过指针访问顺序存储结构的谓词操作。

步骤a对顺序存储结构进行适用于数据流分析的建模过程如下:

对于c程序中的一个变量p,当p为数组变量时,其模型表示为<var,region,domain>,此时取值区间为各数组元素区域信息,其中由某个数组元素索引与其对应区域构成;当p为指针变量时,domain={d1,d2,…,dn}为p指向区域与对应偏移的集合,其中di=<ptregion,offset>,ptregion为指针变量p指向的内存对象var对应区域,且offset是一个整型表达式,表示偏离指向基址的偏移量对应的整型区间。

步骤b中通过指针访问顺序存储结构的迁移操作的过程如下:

安全范围判别是指在执行迁移操作前,对指针变量指向区域偏移将发生的增大或缩小进行预先判定,若超出顺序存储结构的索引下界或上界,则提示outofbounds警告。

指针访问顺序存储结构的操作包括值访问与地址访问两种。

其中,地址访问的迁移操作分析过程如下:

判断该操作是否是指针自加或自减操作,

若是,则确定自加或自减符号,根据变量只想区域与偏移确定后一个或前一个对象x;

若否,则判断是否为数组变量或指针变量或数组元素取地址与整型表达式的加减操作;若否,分析结束;若是,则确定整型表达式的值,根据数组变量或指针变量或数组元素取地址确定右端对象x;

判断对象x是否存在,

若不存在,则提示outofbounds警告后,分析结束;

若存在,则判断对象x是否已经抽象表示;若是,则左端更新符合表达式、基址、指向区域、偏移区间后,分析结束;若否,则先对对象x进行抽象建模,再左端更新符合表达式、基址、指向区域、偏移区间后,分析结束。

假定在程序点l处,表示获得内存对象var对应区域r,plp={ptregion1,ptregion2,…,ptregionn}为指针变量p指向区域的集合,blr表示获得区域r对应的基址区域,length为该区域单元个数即长度,olr表示获得区域r偏离基址区域的偏移区间offset,elr表示根据区域r获得符号表达式,表示根据符号表达式sexp获得具体抽象取值区间domain。

值访问的迁移操作分析过程如下:

判断该操作是否为指针引用顺序存储结构元素操作,

若否,则先确定指针变量当前指向区域对应对象,然后对指针变量指向对象的取值区间进行区间并操作,再将生成的新区间赋值给左端变量后,分析结束;

若是,则先确定指针变量当前指向区域与偏移,然后引用顺序存储结构元素x,再判断x是否存在;

若不存在,则提示outofbounds警告后,分析结束;

若存在,则判断x则判断对象x是否已经抽象表示;若是,则将生成的新区间赋值给左端变量后,分析结束;若否,则先对x进行抽象建模,再将生成的新区间赋值给左端变量后,分析结束。

谓词操作分析过程如下:

先确定关系符号左右两端对象x、y,再判断x、y是否都存在,

若否,则分析结束;

若是,则判断x、y是否存在共同基址,

若不存在,则分析结束;

若存在,则先取出满足两端存在共同基址的部分(m、n),对相应的指针变量进行指向区域和偏移区间的更新,再判断m、n的偏移区间是否全部或部分满足关系;

若否,则分析结束;

若是,则取出此时指针变量对应的指向区域与偏移区间后,分析结束。

假定flag标记条件的布尔值,true表示条件为真,false表示条件为假,trueorfalse表示无法判断。

本发明的抽象内存模型相比现有的大多数抽象内存模型,可实现对顺序存储结构上发生偏移的性质进行有效刻画,同时通过定义的迁移操作及谓词操作可准确描述指针访问顺序存储结构的过程,并保证操作的安全性。

应用例1:

如,下面的代码段:

用本发明所提出的抽象内存模型对代码中的部分变量进行建模,分析得出l6行结构体变量x的模型表示为<x,usm_0,{}>;l7行变量i用本模型表示为<i,bm_1,i_01,[-inf,inf]>,[-inf,inf]用来标识函数内数值型变量取值区间未知,同时变量value可表示为<value,bm_2,1>;l8行指针变量fmt指向整型变量i,其模型表示为<fmt,pm_3,fmt_45,{<bm_1,[0,0]>}>,其中指针指向基本类型变量时其偏移区间固定为[0,0],其次无法确定指针变量ptr的指向,故其模型表示为<ptr,pm_7,ptr_1011,{<wild,[0,0]>}>,其中野指针指向地址的区域编号为“wild”,offset初始区间为[0,0];同样地,l9行指针变量buf、line、more可分别表示为<buf,pm_8,buf_1213,{<wild,[0,0]>}>、<line,pm_9,line_1415,{<wild,[0,0]>}>,<more,pm_10,more_1617,{<wild,[0,0]>}>;l10行在为结构体变量x的成员data赋值后,x.data用模型表示为<x.data,ubm_11,3.0>,同时变量x模型更新为<x,usm_0,{data:3.0}>;l11行执行结束后,变量buf的模型表示为<buf,pm_8,buf_1819,{<mbm_12_8,[0,0]>}>。

对于代码中地址访问操作分析过程如下:代码l12行执行完成后指针变量line指向发生变化,指向元素buf[5],其模型表示为<line,pm_9,line_2021,{<bm_15,[5,5]>}>,其中“bm_15”为buf[5]的区域编号。在代码l13行,指针变量line先执行自加操作,其模型表示为<line,pm_9,line_2425,{<bm_16,[6,6]>}>,指向区域及偏移区间均发生变化。同样地,在执行对指针变量more的赋值操作后,more的模型表示为<more,pm_10,more_2829,{<bm_16,[6,6]>}>。若满足if条件,则在l14行执行时,line应指向buf[8],但超过连续内存索引上界,提示outofbounds警告。

对于代码中的值访问操作分析过程如下:在l22行语句执行前,指针变量ptr指向两个内存对象x.result[0]与x.result[5],故其模型表示为<ptr,pm_7,ptr_4445,{<ubm_19,[0,0]>,<ubm_20,[5,5]>}>,同时,x.result的模型表示更新为<x.result,uam_18,{<0,ubm_19>,<5,ubm_20>}>;当执行l22行时,通过指向区域获得对应区域的符号表达式x.result[0]_3637、x.result[5]_4041,并依据符号表达式获取当前x.result[0]与x.result[5]的取值均为[-inf,inf],同时取并集为[-inf,inf],其次生成新的符号表达式并与[-inf,inf]之间建立映射关系。在l23行执行时,因区域{“ubm_20”}对应偏移为[5,5],[5,5]+value+2后将超出x.result的索引上界,提示outofbounds警告,因此该行只根据区域{“ubm_19”}进行计算,与l22行过程类似。

对于示例代码中谓词操作的分析过程如下:l14行代码分析可得,条件右端指向buf[6],左端指向buf[5],两者存在共同基址,同时左端偏移区间[5,5]与右端偏移区间[6,6]满足小于等于关系,故该条件为真,一定执行if语句块内代码。

本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。

对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1