CN102999426B - 基于抽象内存模型的非数值型数据的计算方法 - Google Patents
基于抽象内存模型的非数值型数据的计算方法 Download PDFInfo
- Publication number
- CN102999426B CN102999426B CN201210506230.6A CN201210506230A CN102999426B CN 102999426 B CN102999426 B CN 102999426B CN 201210506230 A CN201210506230 A CN 201210506230A CN 102999426 B CN102999426 B CN 102999426B
- Authority
- CN
- China
- Prior art keywords
- abstract
- variable
- pointer
- storage location
- internal storage
- 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
Links
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Complex Calculations (AREA)
Abstract
本发明提供了一种基于抽象内存模型的非数值型数据的计算方法,包括:A、设计抽象内存模型用于模拟数值型变量和非数值型变量的内存结构,以及存储变量操作中包含的语义信息和约束关系;B、提取数值型变量和非数值类型变量的类型操作中包含的语义信息,并将语义信息映射到抽象内存模型中;C、提取数值型变量和非数值类型变量的类型操作中包含的变量间约束和变量内约束,并将约束关系映射到抽象内存模型;D、从抽象内存模型中提取变量的语义信息和约束关系,使用测试用例构建算法和第三方的约束求解器构建测试用例。采用本发明,可以克服现有技术无法精确支持非数值型变量程序语义的不足,实现包含非数值型的程序自动生成测试用例的目的。
Description
技术领域
本发明涉及软件测试技术,尤其涉及基于抽象内存模型的非数值型数据的计算方法,属于单元测试中对含非数值型数据程序的语义模拟和约束提取技术领域。
背景技术
软件测试分为动态测试和静态测试两种。动态测试是通过运行软件来检测软件的动态行为和运行结果的正确性;静态测试是收集、查找程序的信息,对被测程序进行特征分析,其主要优点是在程序运行之前就可以收集程序的语义信息。在实际的软件测试中,实际的程序逻辑可以非常复杂的。基于静态分析的测试用例生成方案可以很好的支持数值型的程序,对非数值类型的程序,该方案不能很好的记录程序的语义信息,导致自动生成非数值类型的测试用例困难。尤其是指针的别名问题和数组的变下标引用,是符号执行的难点问题。
发明内容
有鉴于此,本发明的主要目的在于提供一种基于抽象内存模型的非数值型数据的计算方法,其采用抽象内存建模技术存储路径分析过程中变量相关语义信息,在抽象内存中为每个变量分配一个抽象内存单元,并将与该变量相关的指令操作映射为对抽象内存的操作,精确记录变量的结构语义和操作语义。
为达到上述目的,本发明的技术方案是这样实现的:
一种基于抽象内存模型的非数值型数据的计算方法,该方法包括:
A、设计抽象内存模型用于模拟数值型变量和非数值型变量的内存结构,以及存储变量操作中包含的语义信息和约束关系;
B、提取数值型变量和非数值类型变量的结构体类型操作和指针类型操作中包含的语义信息,并将语义信息映射到抽象内存模型中;
C、提取数值型变量和非数值类型变量的不同类型的操作中包含的变量间约束和变量内约束,并将约束关系映射到抽象内存模型中;
D、从抽象内存模型中提取变量的语义信息和约束关系,使用测试用例构建算法和约束求解器构建测试用例;具体为:采用抽象内存建模技术存储路径分析过程中变量相关语义信息,路径分析结束后,变量的非数值型约束和数值型约束都保存在抽象内存模型中,测试用例生成算法就是从抽象内存中按预设规则分别提取变量的数值型约束和非数值型约束,构建测试用例;其包括:
D11、如果变量var是数值类型,获取约束集中域中域变量相关的约束关系,利用第三方约束求解器求解出满足约束的值;如果求值失败则此次测试用例生成过程失败;
D12、如果变量var为结构体类型,逐个为结构体的成员域递归调用测试用例构建算法,然后组装成结构体变量var的值;
D13如果变量var为数组类型,首先调用约束求解器求解下标和数组长度之间的约束,生成合适的长度和具体的下标,构建数组的形状,然后使用测试用例构建算法逐个为下标对应的元素递归调用建立测试用例buildTestCase生成测试用例;
D14、如果变量var为指针类型,获取对应的抽象内存,若指针变量的状态为空或不确定,则指针变量var为NULL;指针变量的状态为非空,获取指向域,若指向域的输入标志inputFlag属性取值为F,表明其指向的内存单元是在函数内存分配的,不属于测试用例的一部分;若指向域的输入标志inputFlag属性取值为T,则按所述指针类型递归调用测试用例构建算法。
其中,步骤A进一步包括:使抽象内存主要用于存储变量的语义信息,按C语言的数据类型将抽象内存模型分为四个区:数值区、数组区、结构体区和指针区。
所述步骤B包括:
B1、对于数值类型的变量进行的语义操作包括:使用变量名索引抽象内存是否存在对应的抽象内存记录,若存在则返回抽象内存地址,若不存在,则在抽象内存中为该变量分配一个新的抽象内存单元,分配新的符号S表示该变量的取值域;
B2、对于结构体类型变量的语义操作包括访问结构体变量和访问结构体变量的成员;
B3、对于数组类型变量的语义操作包括访问数组变量和通过数组下标访问数组成员;
B4、对于指针类型变量的语义操作包括访问指针变量和访问指针变量的指向域*,对于结构体指针变量,通过→访问变量成员,赋值操作改变指针的指向。
所述步骤B2具体为:
B21、访问结构体类型变量的语义操作包括:使用变量名索引抽象内存是否存在对应的抽象内存记录,若存在则返回抽象内存地址,若不存在,在抽象内存中为该变量分配一个新的抽象内存单元,返回该抽象内存单元的地址;
B22、访问结构体变量的成员的语义操作包括:获取结构体变量的抽象内存单元Ms,按成员变量名查找Ms中的成员属性区,查看是否已为该成员分配抽象内存单元,若存在,返回该成员抽象内存单元的地址,若不存在,按成员类型新建新的抽象内存单元,返回新建抽象内存单元的地址。
所述步骤B3具体为:
B31、访问数组变量的语义操作包括:使用变量名索引抽象内存是否存在对应的抽象内存记录,若存在则返回抽象内存地址,若不存在,则在抽象内存中为该变量分配一个新的抽象内存单元,返回该抽象内存单元的地址;
B32、通过数组下标访问数组成员的语义操作包括:获取数组变量的抽象内存单元Ma,按下标表达式查找Ma中的成员属性区,查看是否已为该成员分配抽象内存单元,若存在,返回该成员抽象内存单元的地址,若不存在,则按成员类型新建新的抽象内存单元,返回新建抽象内存单元的地址。
所述步骤B4具体为:
B41、访问指针变量的语义操作包括:使用变量名索引抽象内存是否存在对应的抽象内存记录,若存在则返回抽象内存地址,若不存在,则在抽象内存中为该变量分配一个新的抽象内存单元,返回该抽象内存单元的地址;
B42、访问指针的指向域的语义操作包括:获取指针变量的抽象内存单元Mp,查看Mp的指向域是否已经分配抽象内存单元,如果已经分配,返回该指向域的抽象内存单元的地址,若不存在,按成员类型新建新的抽象内存单元,返回新建抽象内存单元的地址;
B43、访问结构体指针的成员:获取指针变量指向域,结构体类型的抽象内存单元的地址Ms,获取结构体的成员对应的抽象内存单元的地址;
B44、指针的赋值操作的语义操作包括:获取左指针的抽象内存地址,判定p是否是第一次被重定义,如果是则将其当前指向域pt和指针状态state分别存储到初始指向域initPT和初始状态initState中;然后获取右指针的抽象内存地址,左指针的当前指向域pt和指针状态state分别被赋值为右指针的当前指向域pt和指针状态state,表示它们指向相同的抽象内存单元;
B45、指针的条件判断操作,获取左右指针指向域的抽象内存地址,取真值时,左右指针指向相同的指向域,合并左右指针的指向域为同一个;如果合并中出现矛盾,则此次测试用例生成失败;如果取假值,则添加左右指针不可以相同抽象内存单元的约束;
B46、指针的算术运算操作的语义操作包括,获取指针指向域的抽象内存单元,在抽象内存模型中查找该指向域抽象内存单元是否在数组抽象内存区某一抽象内存单元的成员,如果存在,返回该数组抽象内存单元,如果不存在,则新建一数组抽象内存单元;新建符号S表示指向域抽象内存单元在数组中的下标,添加下标成员到数组中,返回该数组抽象内存单元的地址和下标符号S;通过符号S进行指针的算术运算操作,然后添加运算后的下标对应的下标成员到数组中;再改变指针的指向到新的抽象内存单元;
B47、指针的比较操作的语义操作与上述步骤B46类似。
所述步骤C具体包括:
C1、数值类型的操作包含算术运算:+、-、*、/;逻辑运算:&&、||、!;条件判断:>、>=、<、<=、==;赋值语句:=,+=,-=,*=,/=;获取表示数值类型取值的符号表达式,将符号表达式代入到操作表达式中,生成约束关系,存入数值抽象内存区的约束集中;
C2、数组类型的操作包含取值操作:[],下标为常量或变量;
C3、指针的赋值操作:=;指针的条件判断操作:==,!=;指针的算术运算操作:++、--、+、-;指针的比较操作:>、>=、<、<=。
所述步骤C2具体为:
C21、获取数组变量的抽象内存单元的地址,如果下标是常量const,建立数组长度len>=const的约束关系,为数组抽象内存单元添加下标为const的成员元素;
C22、下标是变量var,为下标分配一块数值型抽象内存,用var>=0初始化,并和数组长度len建立约束len>=var,为数组抽象内存单元添加下标为const的成员元素。
所述步骤C3具体为:
C31、对于指针的赋值操作:=;添加左右指针互为别名的约束;
C32、对于指针的条件判断操作:==,!=;取真值时,添加左右指针互为别名的约束,取假值时,添加左右指针不可以指向相同抽象内存单元的约束;
C33、指针的算术运算操作:++、--、+、-;添加指针变量与算术运算后的指针变量的地址偏移约束;
C34、指针的比较操作:>、>=、<、<=;添加左右指针的地址偏移约束。
本发明所提供的基于抽象内存模型的非数值型数据的计算方法,具有以下优点:
静态分析和符号执行相结合的测试用例自动生成技术,是自动化单元测试常用的测试用例自动生成技术,但该技术的缺点是对非数值型的程序支持不完善,生成测试用例困难。而本发明则属于基于路径的单元测试中为非数值类型(含非数值型数据程序的语义模拟和约束提取)自动生成测试用例的方法,其使用抽象内存建模的技术存储路径分析过程中变量相关语义信息,在抽象内存中为每个变量分配一个抽象内存单元,并将与该变量相关的指令操作映射为对抽象内存的操作,精确记录变量的结构语义和操作语义。采用该方法能够弥补传统的基于静态分析的测试用例生成方法无法精确支持非数值型变量(结构体、指针和数组等)程序语义的缺憾,以及能够克服传统的符号执行和静态分析相结合测试用例生成方法无法精确支持非数值型变量(结构体、指针和数组等)程序语义的不足,实现为包含非数值型的程序自动生成测试用例的目的。
附图说明
图1为本发明基于抽象内存模型的非数值型数据的计算方法的流程图;
图2本发明中抽象内存的结构示意图。
具体实施方式
下面结合附图及本发明的实施例对本发明的方法作进一步详细的说明。
本发明的基本思想为:首先从被测函数的控制流图上得到一条路径作为被测路径,然后为被测函数的输入域参数分配抽象内存单元;之后逐个对路径上的节点进行语义模拟,将每条指令映射为对应的抽象内存操作,提取语义信息存入抽象内存中,将符号间的数值型约束关系存入约束集中;在路径分析结束后,从抽象内存中提取各个输入域参数的结构信息,从约束集中提取和该参数相关的数值型约束,按测试用例生成算法为该参数构建测试用例。
图1为本发明基于抽象内存模型的非数值型数据的计算方法的流程图,如图1所示,其方法主要包括:
步骤1:设计抽象内存模型用于模拟数值型变量和非数值型变量的内存结构,以及存储变量操作中包含的语义信息和约束关系。其具体包括:
使抽象内存主要用于存储变量的语义信息,按C数据类型将抽象内存模型分为四个区:数值区、数组区、结构体区和指针区。
这里,由于数据类型的特征不同,每个区都设有特有的数据结构,以便能够记录相关变量足够的语义信息。抽象内存中的每一条数据称之为一条记录,每条记录有唯一的地址标示,通过地址标示,访问对应的抽象内存单元,该设计类似于数据库的层次化存储。以指针变量int*p为例,在抽象内存的指针区和数值区将会分别生成一条记录。
表1抽象内存模型核心属性
addr | aliases | source | varName | type |
dm0 |
其属性及其含义如下:
表2数值型抽象内存表
addr | aliases | source | varName | type | expr | constraint |
Mni |
其属性及其含义如下:
表3结构体抽象内存表
addr | aliases | source | varName | type | mem1 | …… | memn |
Msi |
其属性及其含义如下:
表4指针的抽象内存表
addr | aliases | source | varName | type | initPT | initState | pt | state |
Mpi |
其属性及其含义如下:
表5数组的抽象内存表
其属性及其含义如下:
步骤2:提取数值型变量和非数值类型变量的类型操作中包含的语义信息,并将语义信息映射到抽象内存模型中;其具体包括:
步骤21、结构体的操作包括取成员操作(.)和赋值操作(=)等。进一步的,包括:
步骤211、结构体的取成员操作(.),包含的语义信息为取结构体的成员。获取结构体变量的抽象内存单元,按成员变量名获取成员变量的抽象内存地址,返回抽象内存地址对应的抽象内存单元。
步骤212、结构体的赋值操作=,分别获取操作符左右变量的抽象内存单元,遍历右变量的各个成员的抽象内存单元,将其语义信息赋值给左变量的对应单元。
步骤22、指针的取值操作(*)、指针的赋值操作(=)、指针的条件判断操作(==,!=)、指针的算术运算操作(++、--、+、-)、指针的比较操作(>、>=、<、<=)等。具体包括:
步骤221、指针的取值*操作,指针p的取值操作符*是一元操作符,包含的程序语义信息为:a)指针p不为NULL;b)读取*p的内容,即p的指向域有取值域。
将该操作的语义信息映射到抽象内存中的步骤为:读取p的抽象内存地址Pmp,然后在结构体内存区新建内存单元Smp,建立Pmp到Smp的指向Mpppt=Msp,设定指针状态Pmpstate=NOTNULL;
步骤222、结构体指针p的取值->操作是一元操作符,与操作符*相同,它含的程序语义信息为:a)指针p不为NULL;b)读取(*p)的内容,即p的指向域有取值域。
将该操作的语义信息映射到抽象内存中的步骤为:读取p的抽象内存地址Pmp,然后在结构体内存区新建内存单元Smp,建立Pmp到Smp的指向Mpppt=Msp,设定指针状态Pmpstate=NOTNULL;
步骤223、指针的赋值操作符p=q,包含的程序语义信息为:
a)p和q不为NUILL,b)如果p指向某抽象内存空间,解除和该抽象内存空间的指向关系。c)p指向q指向的抽象内存空间。
将该操作的语义信息映射到抽象内存中的步骤为:首先清除p的非数值型约束Clear(Mpp,Mpppt),然后针对指针q的三种不同状态做不同处理:a)q的状态为空:设定p的状态为NULL。b)q的状态不确定:设定p的状态为UNSURE,为*q新建一块抽象内存单元mi,p和q均指向mi。c)q的状态为非空:设定p的状态为NOTNULL,p指向q指向的抽象内存单元。
步骤224、指针条件判断操作(==,!=),判定条件取真时,例如p==q,包含的程序语义信息为合并p和q的指向的抽象内存x和y。具体的合并原则为a)
将p和q的别名集合并,并将所有别名的指向抽象内存x。b)按符号运算的规则合并数值型抽象内存中的符号表达式。c)删除抽象内存y。判定条件取假时p!=q,获取p和q的抽象内存单元,添加这两个抽象内存单元不能合并的约束。
将该操作的语义信息映射到抽象内存中的步骤为:根据p和q状态的不同,分别进行处理(p和q的抽象内存地址分别为Mpp,Mpq):a)p和q的状态均为不确定:新建抽象内存单元Ms0,设置Mpppt,Mpqpt为Ms0。b)p和q的状态一个为非空,一个为不确定:假设p的状态为NOTNULL,读取Mpppt的抽象内存单元Ms0,设置Mpqpt为Ms0,Mpqstate=NOTNULL。c)p和q均为非空:读取Mpppt和Mpqpt的指向Msp和Msq,合并Smp和Smq,然后释放无用的抽象内存单元Msp,将Mpppt和Mpqpt的指向域pt均设置为Smq。d)p和q均为空:约束已经满足。e)p和q一个为非空,一个为空:矛盾,此次测试用例生成失败。
步骤225、指针的条件判断p>q操作,包含的语义信息为:p和q均为非空,p和q的地址存在前后或者间距约束。
将该操作的语义信息映射到抽象内存中的步骤为:设定p和q的状态为非空:Mppstate=NOTNULL;Mpqstate=NOTNULL;新建抽象内存单元分别作为p和q的指向域:Mpppt=Create(*p);Mpqpt=Create(*q);然后使用虚拟数组处理指针地址间约束:创建虚拟数组vam;p和q分别对用虚拟数组的地址VAddrp和VAddrq,虚拟数组的长度VLen=max{0,VAddrp,VAddrq}+1,Mpppt和Mpqpt分别是地址VAddrp和VAddrq处的虚拟数组单元。因此,可以用VAddrp-VAddrq<5表示指针纸箱内存地址的间距。
步骤226、指针的条件判断p<q操作,包含的程序语义信息与p>q类似。
步骤227、指针的条件判断p>=q操作,包含的程序语义信息与p>q类似。
步骤228、指针的条件判断p<=q操作,包含的程序语义信息与p>q类似。
步骤229、指针的地址位移运算p+offset,包含的程序语义信息为它指向一块连续的内存,即它是数组中第offset个元素的别名。
将该操作的语义信息映射到抽象内存中的步骤为:如果数组已经定义,分配一块抽象内存单元表示*(p+offset),对应的数组下标为p的下标加offset;如果数组不存在,首先新建一块数组抽象内存am0,分配p(对应的下标为s0,s0为新生成的符号)和p+offset(对应的下标为s0+offset)的两块内存空间pm0和pim0。在am0中记录<s0,pm0>和<s0+i,pim0>的索引信息。
步骤2210、指针的地址位移运算-,包含的程序语义信息与指针的地址位移运算+类似。
步骤2211、指针的地址位移运算++,包含的程序语义信息与指针的地址位移运算+类似。
步骤2212、指针的地址位移运算--,包含的程序语义信息与指针的地址位移运算+类似。
下面以具体的程序insertnodec说明抽象内存模型是如何在路径分析中记录程序执行的语义的。
如,选择路径7-8-12-13-14-15,根据输入域参数初始化抽象内存。
指针抽象内存表为:
addr | aliases | source | name | type | initPT | initState | pt | state |
pm0 | {} | INPUT | head | struct Node* | sm0 | UNSURE |
结构体抽象内存表:
addr | aliases | source | name | type | <mem,memory> |
sm0 | {pm0} | INPUT_ANNOMY | var0 | struct Node* |
数值型抽象内存表:
addr | aliases | source | name | type | Expression |
dm0 | {} | INPUT | e | int | factor0 |
符号因子:
symbol | domain | constraints |
factor0 | (-inf,+inf) |
执行语句7-8后的抽象内存:
指针抽象内存表:
addr | aliases | source | name | type | initPT | initState | pt | state |
pm0 | {} | INPUT | head | struct Node* | sm0 | UNSURE | ||
pm1 | {} | LOCAL | eNode | struct Node* | sm1 | NOT_NULL |
结构体抽象内存表:
addr | aliases | source | name | type | <mem,memory> |
sm0 | {pm0} | INPUT_ANNOMY | var0 | struct Node | |
sm1 | {pm1} | LOCAL_ANNOMY | var1 | struct Node | <”data”,dm0> |
数值型抽象内存表:
addr | aliases | source | name | type | Expression |
dm0 | {} | INPUT | e | int | factor0 |
dm1 | {} | LOCAL_ANNOMY | var2 | int | factor1 |
符号因子:
执行语句13-15后的抽象内存表:
指针抽象内存表:
addr | aliases | source | name | type | initPT | initState | pt | state |
pm0 | {} | INPUT | head | struct Node* | sm0 | NOT_NULL | ||
pm1 | {} | LOCAL | eNode | struct Node* | sm1 | NOT_NULL | ||
pm2 | {} | LOCAL | var4 | struct Node* | sm2 | UNSURE | ||
pm3 | {} | LOCAL | var4 | struct Node* | sm1 | UNSURE |
结构体抽象内存表:
数值型抽象内存表:
addr | aliases | source | name | type | Expression |
dm0 | {} | INPUT | e | int | factor0 |
dm1 | {} | LOCAL_ANNOMY | var2 | int | factor1 |
dm2 | {} | INPUT_ANNOMY | var3 | int | facotr2 |
符号因子:
执行条件判断if(head->data>eNode->data),选择真分支后,则:指针抽象内存表:
结构体抽象内存表:
数值型抽象内存表:
addr | aliases | source | name | type | Expression |
dm0 | {} | INPUT | e | int | factor0 |
dm1 | {} | LOCAL_ANNOMY | var2 | int | factor1 |
dm2 | {} | INPUT_ANNOMY | var3 | int | facotr2 |
符号因子:
如下为测试用例生成过程:
第一步:计算与input(source值)相关的符号表达式;
factor2>factor0;=>factor2=5,factor0=3;
第二步:为输入域生成测试用例;
e=3;
步骤23、数组的运算操作主要是[],数组是常量指针,它还包含一些指针的操作如*、+等。
步骤231、数组的读取成员元素操作[],数组取成员操作[]建立两个维度上的约束,a)下标和长度的约束0=<sub<len;b)建立数组元素和其它变量间的约束,如a[i]<a[j];
将该操作的语义信息映射到抽象内存中的步骤为:获取数组变量的抽象内存单元,通过下标获取对应成员元素的抽象内存地址。若下标在该数组元素中还不存在,则为其对应的成员元素分配新的抽象内存单元,并将<下标,抽象内存地址>添加到数组变量的抽象内存中。返回下标对应数组元素的抽象内存单元。
步骤232、数组的读取成员元素操作符(*),包含的语义信息与指针的*操作类似。
步骤233、数组的算术运算符(+),如a+i,表示首地址偏移i的元素,包含的语义信息类似于指针的+操作。
下面以具体的程序arrc说明抽象内存模型是如何在路径分析中记录程序执行的中数组语义的。
数组的抽象内存表:
addr | aliases | source | name | type | len | <sub,abs_mem> |
am0 | {} | INPUT | a | int[] |
数值型抽象内存表:
addr | aliases | source | name | type | Expression |
dm0 | INPUT | i | int | factor0 | |
dm1 | INPUT | j | int | factor1 |
符号因子:
执行i<j和a[i]=a[j]后的抽象内存表:
数组的抽象内存表:
数值型抽象内存表:
addr | aliases | source | name | type | Expression |
dm0 | {} | INPUT | i | int | factor0 |
dm1 | {} | INPUT | j | int | factor1 |
dm2 | {} | INPUT_ANONY | am0[factor0] | int | factor2 |
dm3 | {} | INPUT_ANONY | am0[factor1] | int | factor3 |
符号因子:
如下为测试用例生成:
第一步:计算与input(source值)相关的符号表达式
factor0=3;
factor1=10;
factor2=5;
factor3=8;
factor_am0_len=max{factor0,factor1}+1=11;
第二步:为输入域生成测试用例
i=3;j=10;
步骤24、对于指针类型变量的语义操作包括访问指针变量和访问指针变量的指向域*,对于结构体指针变量,通过→访问变量成员,赋值操作改变指针的指向。具体为:
步骤241、访问指针变量的语义操作包括:使用变量名索引抽象内存是否存在对应的抽象内存记录,若存在则返回抽象内存地址,若不存在,则在抽象内存中为该变量分配一个新的抽象内存单元,返回该抽象内存单元的地址;
步骤242、访问指针的指向域的语义操作包括:获取指针变量的抽象内存单元Mp,查看Mp的指向域是否已经分配抽象内存单元,如果已经分配,返回该指向域的抽象内存单元的地址,若不存在,按成员类型新建新的抽象内存单元,返回新建抽象内存单元的地址;
步骤243、访问结构体指针的成员:获取指针变量指向域,结构体类型的抽象内存单元地址Ms,获取结构体的成员对应的抽象内存单元的地址;
步骤244、指针的赋值操作的语义操作包括:获取左指针的抽象内存地址,判定p是否是第一次被重定义,如果是则将其当前指向域pt和指针状态state分别存储到初始指向域initPT和初始状态initState中;然后获取右指针的抽象内存地址,左指针的当前指向域pt和指针状态state分别被赋值为右指针的当前指向域pt和指针状态state,表示它们指向相同的抽象内存单元;
步骤245、指针的条件判断操作,获取左右指针指向域的抽象内存地址,取真值时,左右指针指向相同的指向域,合并左右指针的指向域为同一个;如果合并中出现矛盾,则此次测试用例生成失败;如果取假值,则添加左右指针不可以相同抽象内存单元的约束;
步骤246、指针的算术运算操作的语义操作包括,获取指针指向域的抽象内存单元,在抽象内存模型中查找该指向域抽象内存单元是否在数组抽象内存区某一抽象内存单元的成员,如果存在,返回该数组抽象内存单元,如果不存在,则新建一数组抽象内存单元;新建符号S表示指向域抽象内存单元在数组中的下标,添加下标成员到数组中,返回该数组抽象内存单元的地址和下标符号S;通过符号S进行指针的算术运算操作,然后添加运算后的下标对应的下标成员到数组中;再改变指针的指向到新的抽象内存单元;
步骤247、指针的比较操作的语义操作与上述步骤246类似。
步骤3:提取数值型变量和非数值类型变量的类型操作中包含的变量间约束和变量内约束,并将约束关系映射到抽象内存模型中。具体包括:
步骤31、数值类型的操作包含算术运算+、-、*、/等,逻辑运算&&、||、!等,条件判断>、>=、<、<=、==等,赋值语句=,+=,-=,*=,/=等。按步骤21描述的方式获取表示数值类型取值的符号表表达式,将符号表达式代入到操作表达式中,生成约束关系,存入数值抽象内存区的约束集中。
步骤32、数组类型的操作包含取值操作[],下标可能是常量,可能是变量。进一步的,包括如下步骤:
步骤321、按步骤231描述的方式获取数组变量的抽象内存单元,如果下标是常量const,建立数组长度len>=const的约束关系,按步骤232描述的方式为数组抽象内存单元添加下标为const的成员元素。
步骤322、下标是变量var,为下标分配一块数值型抽象内存,用var>=0初始化,并和数组长度len建立约束len>=var,按步骤233描述的方式为数组抽象内存单元添加下标为const的成员元素。
步骤33、指针的赋值操作(=)、指针的条件判断操作(==,!=)、指针的算术运算操作(++、--、+、-)、指针的比较操作(>、>=、<、<=)等。
步骤331、对于指针的赋值操作(=),如步骤243所述的语义操作,添加了左右指针互为别名的约束。
步骤332、对于指针的条件判断操作(==,!=),取真值时,添加左右指针互为别名的约束,取假值时,添加左右指针不可以相同抽象内存单元的约束。
步骤333、指针的算术运算操作(++、--、+、-),如步骤245所述的语义操作,添加了指针变量与算术运算后的指针变量的地址偏移约束。
步骤334、指针的比较操作(>、>=、<、<=),如步骤246所述的语义操作,添加了左右指针的地址偏移约束。
步骤4:从抽象内存模型中提取变量的语义信息和约束关系,使用测试用例构建算法和第三方的约束求解器构建测试用例。具体包括:
步骤41、路径分析结束后,变量的非数值型约束和数值型约束都保存在了抽象内存模型中,测试用例生成算法就是从抽象内存中按一定规则分别提取变量的数值型约束和非数值型约束,构建测试用例。进一步的,包括:
步骤411、如果变量var是数值型(数值型变量,费数值型变量的数值型成员变量),获取变量var的抽象内存单元Mni,读取他的expr值,以及与expr中符号相关的约束集,调用第三方约束求解器求解出满足所有约束的某个具体的值。
步骤412、如果变量var为指针类型,获取对应的抽象内存Mpi,如果指针变量的状态Mpistate为空或不确定,则var=null;指针变量的状态Mpistate为非空,获取指向域Mpipt,如果Mpipt的inputFlag属性取值为F,表明其指向的内存单元是在函数内存分配的,不属于测试用例的一部分,因此var=null;如果取值为T,则var!=null;递归调用buildTestCase为指向域生成测试用例。
步骤413、如果变量var为结构体类型,逐个为结构体的成员域递归调用buildTestCase生成测试用例。
步骤414、如果变量var为数组类型,首先调用约束求解器求解下标和数组长度之间的约束,生成合适的长度和具体的下标,构建数组的形状,然后逐个为下标对应的元素递归调用buildTestCase生成测试用例。
测试用例生成算法中各函数的作用如下:
buildTestCase:测试用例生成的顶层函数。
solveConstraint:调用第三方约束求解器求解约束。
build:构建测试用例的形状或者数值域的取值。
算法1:测试用例构建算法。
步骤333演示的程序arrc的测试用例生成过程为:
第一步:计算与input(source值)相关的约束关系。
a)访问数组变量的抽象内存单元,获取所有的下标相关约束,利用约束求解器求解出一组满足所有约束的值如下:
factor0=3;
factor1=10;
factor2=5;
factor3=8;
b)访问数组的抽象内存单元,获取数组长度的相关约束,上一个步骤中将数组的下标值求出,数组长度取下标最大值加1。
factor_am0_len=max{factor0,factor1}+1=11;
第二步:组建测试用例
i=3;j=10;
a[]:
a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] | a[8] | a[9] | a[10] |
5 | 8 |
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。
Claims (9)
1.一种基于抽象内存模型的非数值型数据的计算方法,其特征在于,该方法包括:
A、设计抽象内存模型用于模拟数值型变量和非数值型变量的内存结构,以及存储变量操作中包含的语义信息和约束关系;
B、提取数值型变量和非数值类型变量的结构体类型操作和指针类型操作中包含的语义信息,并将语义信息映射到抽象内存模型中;
C、提取数值型变量和非数值类型变量的不同类型的操作中包含的变量间约束和变量内约束,并将约束关系映射到抽象内存模型中;
D、从抽象内存模型中提取变量的语义信息和约束关系,使用测试用例构建算法和约束求解器构建测试用例;具体为:采用抽象内存建模技术存储路径分析过程中变量相关语义信息,路径分析结束后,变量的非数值型约束和数值型约束都保存在抽象内存模型中,测试用例生成算法就是从抽象内存中按预设规则分别提取变量的数值型约束和非数值型约束,构建测试用例;其包括:
D11、如果变量var是数值类型,获取约束集中域中域变量相关的约束关系,利用第三方约束求解器求解出满足约束的值;如果求值失败则此次测试用例生成过程失败;
D12、如果变量var为结构体类型,逐个为结构体的成员域递归调用测试用例构建算法,然后组装成结构体变量var的值;
D13如果变量var为数组类型,首先调用约束求解器求解下标和数组长度之间的约束,生成合适的长度和具体的下标,构建数组的形状,然后使用测试用例构建算法逐个为下标对应的元素递归调用建立测试用例buildTestCase生成测试用例;
D14、如果变量var为指针类型,获取对应的抽象内存,若指针变量的状态为空或不确定,则指针变量var为NULL;指针变量的状态为非空,获取指向域,若指向域的输入标志inputFlag属性取值为F,表明其指向的内存单元是在函数内存分配的,不属于测试用例的一部分;若指向域的输入标志inputFlag属性取值为T,则按所述指针类型递归调用测试用例构建算法。
2.根据权利要求1所述基于抽象内存模型的非数值型数据的计算方法,其特征在于,步骤A进一步包括:使抽象内存主要用于存储变量的语义信息,按C语言的数据类型将抽象内存模型分为四个区:数值区、数组区、结构体区和指针区。
3.根据权利要求1所述基于抽象内存模型的非数值型数据的计算方法,其特征在于,所述步骤B包括:
B1、对于数值类型的变量进行的语义操作包括:使用变量名索引抽象内存是否存在对应的抽象内存记录,若存在则返回抽象内存地址,若不存在,则在抽象内存中为该变量分配一个新的抽象内存单元,分配新的符号S表示该变量的取值域;
B2、对于结构体类型变量的语义操作包括访问结构体变量和访问结构体变量的成员;
B3、对于数组类型变量的语义操作包括访问数组变量和通过数组下标访问数组成员;
B4、对于指针类型变量的语义操作包括访问指针变量和访问指针变量的指向域*,对于结构体指针变量,通过→访问变量成员,赋值操作改变指针的指向。
4.根据权利要求3所述基于抽象内存模型的非数值型数据的计算方法,其特征在于,所述步骤B2具体为:
B21、访问结构体类型变量的语义操作包括:使用变量名索引抽象内存是否存在对应的抽象内存记录,若存在则返回抽象内存地址,若不存在,在抽象内存中为该变量分配一个新的抽象内存单元,返回该抽象内存单元的地址;
B22、访问结构体变量的成员的语义操作包括:获取结构体变量的抽象内存单元Ms,按成员变量名查找Ms中的成员属性区,查看是否已为该成员分配抽象内存单元,若存在,返回该成员抽象内存单元的地址,若不存在,按成员类型新建新的抽象内存单元,返回新建抽象内存单元的地址。
5.根据权利要求3所述基于抽象内存模型的非数值型数据的计算方法,其特征在于,所述步骤B3具体为:
B31、访问数组变量的语义操作包括:使用变量名索引抽象内存是否存在对应的抽象内存记录,若存在则返回抽象内存地址,若不存在,则在抽象内存中为该变量分配一个新的抽象内存单元,返回该抽象内存单元的地址;
B32、通过数组下标访问数组成员的语义操作包括:获取数组变量的抽象内存单元Ma,按下标表达式查找Ma中的成员属性区,查看是否已为该成员分配抽象内存单元,若存在,返回该成员抽象内存单元的地址,若不存在,则按成员类型新建新的抽象内存单元,返回新建抽象内存单元的地址。
6.根据权利要求3所述基于抽象内存模型的非数值型数据的计算方法,其特征在于,所述步骤B4具体为:
B41、访问指针变量的语义操作包括:使用变量名索引抽象内存是否存在对应的抽象内存记录,若存在则返回抽象内存地址,若不存在,则在抽象内存中为该变量分配一个新的抽象内存单元,返回该抽象内存单元的地址;
B42、访问指针的指向域的语义操作包括:获取指针变量的抽象内存单元Mp,查看Mp的指向域是否已经分配抽象内存单元,如果已经分配,返回该指向域的抽象内存单元的地址,若不存在,按成员类型新建新的抽象内存单元,返回新建抽象内存单元的地址;
B43、访问结构体指针的成员:获取指针变量指向域,结构体类型的抽象内存单元的地址Ms,获取结构体的成员对应的抽象内存单元的地址;
B44、指针的赋值操作的语义操作包括:获取左指针的抽象内存地址,判定p是否是第一次被重定义,如果是则将其当前指向域pt和指针状态state分别存储到初始指向域initPT和初始状态initState中;然后获取右指针的抽象内存地址,左指针的当前指向域pt和指针状态state分别被赋值为右指针的当前指向域pt和指针状态state,表示它们指向相同的抽象内存单元;
B45、指针的条件判断操作,获取左右指针指向域的抽象内存地址,取真值时,左右指针指向相同的指向域,合并左右指针的指向域为同一个;如果合并中出现矛盾,则此次测试用例生成失败;如果取假值,则添加左右指针不可以相同抽象内存单元的约束;
B46、指针的算术运算操作的语义操作包括,获取指针指向域的抽象内存单元,在抽象内存模型中查找该指向域抽象内存单元是否是存在于数组抽象内存区的某一抽象内存单元的成员,如果存在,返回该数组抽象内存单元的地址,如果不存在,则新建一数组抽象内存单元;新建符号S表示指向域抽象内存单元在数组中的下标,添加下标成员到数组中,返回该数组抽象内存单元的地址和下标符号S;通过符号S进行指针的算术运算操作,然后添加运算后的下标对应的下标成员到数组中;再改变指针的指向到新的抽象内存单元;
B47、指针的比较操作的语义操作与上述步骤B46类似。
7.根据权利要求1所述基于抽象内存模型的非数值型数据的计算方法,其特征在于,所述步骤C具体包括:
C1、数值类型的操作包含算术运算:+、-、*、/;逻辑运算:&&、||、!;条件判断:>、>=、<、<=、==;赋值语句:=,+=,-=,*=,/=;获取表示数值类型取值的符号表达式,将符号表达式代入到操作表达式中,生成约束关系,存入数值抽象内存区的约束集中;
C2、数组类型的操作包含取值操作:[],下标为常量或变量;
C3、指针的赋值操作:=;指针的条件判断操作:==,!=;指针的算术运算操作:++、--、+、-;指针的比较操作:>、>=、<、<=。
8.根据权利要求7所述基于抽象内存模型的非数值型数据的计算方法,其特征在于,所述步骤C2具体为:
C21、获取数组变量的抽象内存单元的地址,如果下标是常量const,建立数组长度len>=const的约束关系,为数组抽象内存单元添加下标为const的成员元素;
C22、下标是变量var,为下标分配一块数值型抽象内存,用var>=0初始化,并和数组长度len建立约束len>=var,为数组抽象内存单元添加下标为const的成员元素。
9.根据权利要求7所述基于抽象内存模型的非数值型数据的计算方法,其特征在于,所述步骤C3具体为:
C31、对于指针的赋值操作:=;添加左右指针互为别名的约束;
C32、对于指针的条件判断操作:==,!=;取真值时,添加左右指针互为别名的约束,取假值时,添加左右指针不可以指向相同抽象内存单元的约束;
C33、指针的算术运算操作:++、--、+、-;添加指针变量与算术运算后的指针变量的地址偏移约束;
C34、指针的比较操作:>、>=、<、<=;添加左右指针的地址偏移约束。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210506230.6A CN102999426B (zh) | 2012-11-30 | 2012-11-30 | 基于抽象内存模型的非数值型数据的计算方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210506230.6A CN102999426B (zh) | 2012-11-30 | 2012-11-30 | 基于抽象内存模型的非数值型数据的计算方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102999426A CN102999426A (zh) | 2013-03-27 |
CN102999426B true CN102999426B (zh) | 2016-06-29 |
Family
ID=47928023
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210506230.6A Expired - Fee Related CN102999426B (zh) | 2012-11-30 | 2012-11-30 | 基于抽象内存模型的非数值型数据的计算方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102999426B (zh) |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107015798A (zh) * | 2017-03-13 | 2017-08-04 | 深圳市鑫君特智能医疗器械有限公司 | 一种监测程序变量值的方法及系统 |
CN109101413A (zh) * | 2017-06-21 | 2018-12-28 | 中国人民解放军海军航空工程学院青岛校区 | 一种通用的黑盒测试用例自动生成方法 |
CN107992354B (zh) * | 2017-11-14 | 2020-07-31 | 阿里巴巴(中国)有限公司 | 用于降低内存负载的方法以及装置 |
CN110633212B (zh) * | 2019-09-04 | 2022-07-26 | 中国石油大学(华东) | 一种基于抽象内存模型的数据流分析方法 |
CN111475410B (zh) * | 2020-03-31 | 2024-01-09 | 北京经纬恒润科技股份有限公司 | 一种测试用例生成方法及装置 |
CN113485940B (zh) * | 2021-07-27 | 2024-05-14 | 江苏大学 | 一种基于参数抽象建模的组合测试用例生成方法 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101788907A (zh) * | 2010-01-04 | 2010-07-28 | 北京航空航天大学 | 组合服务精简测试用例的自动生成方法及装置 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7478365B2 (en) * | 2004-01-13 | 2009-01-13 | Symphony Services Corp. | Method and system for rule-based generation of automation test scripts from abstract test case representation |
-
2012
- 2012-11-30 CN CN201210506230.6A patent/CN102999426B/zh not_active Expired - Fee Related
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101788907A (zh) * | 2010-01-04 | 2010-07-28 | 北京航空航天大学 | 组合服务精简测试用例的自动生成方法及装置 |
Non-Patent Citations (2)
Title |
---|
基于内存建模的复杂结构类型测试数据自动生成方法;李飞宇 等;《计算机辅助设计与图形学学报》;20120229;第24卷(第2期);第262-270页 * |
测试用例自动生成中约束求解策略的选择;赖思佳 等;《内蒙古大学学报(自然科学版)》;20110930;第24卷(第5期);第540-546页 * |
Also Published As
Publication number | Publication date |
---|---|
CN102999426A (zh) | 2013-03-27 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102999426B (zh) | 基于抽象内存模型的非数值型数据的计算方法 | |
Huang et al. | System and simulation modeling using SysML | |
CN105117573B (zh) | 基于cad排水管网图纸信息的自动水力模型构建方法 | |
JP5659238B2 (ja) | ソースコード変換方法およびソースコード変換プログラム | |
Corrado et al. | Data structuring for the ontological modelling of urban energy systems: The experience of the SEMANCO project | |
CN105183733A (zh) | 一种文本信息的匹配、业务对象的推送方法和装置 | |
US7107280B2 (en) | Method and system for the storage and use of engineering modeling alternatives with unitized data | |
CN109344230A (zh) | 代码库文件生成、代码搜索、联结、优化以及移植方法 | |
CN104063314A (zh) | 一种测试数据自动生成装置及方法 | |
CN107239616A (zh) | 一种集成电路原理图的对比方法 | |
US20120166168A1 (en) | Methods and systems for fault-tolerant power analysis | |
CN103235757B (zh) | 基于自动化造数对输入域测试对象进行测试的装置和方法 | |
CN1979545A (zh) | 一种城市规划数字报建软件系统 | |
Pan et al. | Class structure refactoring of object-oriented softwares using community detection in dependency networks | |
CN105302547A (zh) | 一种面向Verilog HDL设计的故障注入方法 | |
Guang et al. | The development of ecological environment in China based on the system dynamics method from the society, economy and environment perspective | |
CN103150445A (zh) | 一种matlab模型变量的剖析方法及装置 | |
CN105426176B (zh) | 一种基于信息隐藏的图转换系统模型检测方法 | |
CN107291933B (zh) | 基于Petri网的软PLC系统数据同步方法 | |
Zhiyi | Research on logistics management information system based on big data | |
CN102902760B (zh) | 一种检测需求冲突关系的方法 | |
CN109918286A (zh) | 一种静态代码分析的处理方法及装置 | |
Faisal et al. | IT-Architecture Study Literature Research Collaboration: Malay Architecture Context | |
Ding et al. | Cautosim-based Parsing and Preservation Methods for the Modelica Language | |
CN107341021A (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 | ||
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 Termination date: 20211130 |
|
CF01 | Termination of patent right due to non-payment of annual fee |