应用符号分析的软件测试方法转让专利

申请号 : CN201010185904.8

文献号 : CN101840372B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 宫云战肖庆杨朝红金大海黄俊飞王雅文赵云山宋颖

申请人 : 北京邮电大学

摘要 :

本发明公开一种应用符号分析的软件测试方法,该方法包括:A、给出一个符号运算系统,包括符号表达式的表示、化简、运算和计算符号表达式的取值区间;B、给出将程序中各变量间的具体运算映射为符号运算的方法;C、给出程序分支语句对符号取值限定区间的计算方法;D、给出符号分析在程序控制流图上的计算方法。应用本发明的应用符号分析的软件测试方法,能够处理软件静态测试中的变量相关性问题,精确地计算每个程序位置上的变量取值信息,提高软件静态测试的准确性。

权利要求 :

1.一种应用符号分析的软件测试方法,其特征在于,该方法包括:

A、给出一个符号运算系统,包括符号表达式的表示、化简、运算和计算符号表达式的取值区间;具体为:A1、符号表达式的表示方式为:每一个符号表达式由一个或多个项通过加减运算结合而成,每一个项由一个或多个因子通过乘除运算结合而成,每一个因子由一个或多个原子通过幂运算结合而成,每一个原子对应一个当前取值区间;A2、符号表达式的化简方式为:首先将每一个因子化为最简,然后将每一个项化为最简,最后将整个表达式化为最简;A3、符号表达式的运算包括符号表达式之间加、减、乘、除运算;所述符号表达式运算的输入和输出均为化简后的表达式;A4、根据符号表达式中各符号的当前取值区间,通过区间运算求得符号表达式的取值区间;

B、给出将程序中各变量间的具体运算映射为符号运算的步骤;具体为:B1、将程序中的最基本的变量和常量的当前取值都由一个符号表达式来表示;B2、将程序中各种基本表达式的运算映射为符号运算系统上的运算,程序中各种表达式,包括算术表达式、关系表达式、布尔表达式、位运算表达式、赋值表达式和条件表达式;

C、给出程序分支语句对符号取值限定区间的计算步骤;具体为:C1、取分支语句中判断条件表达式为当前表达式;C2、判断当前表达式类型,如果为基本关系表达式,则执行步骤C3;否则执行步骤C4;C3、计算当前表达式对符号的取值限定区间,然后结束;C4、将当前表达式分解为若干子表达式;C5、依次取子表达式为当前表达式;C6、判断当前表达式类型,如果为基本关系表达式,则执行步骤C7;否则执行步骤C8;C7、计算当前表达式对符号的取值限定区间;C8、递归分解计算当前表达式对符号的取值限定区间;C9、判断当前表达式是否为最后一个子表达式,如果是,则执行步骤C10;否则执行步骤C5;C10、根据各子表达式计算结果求得表达式对符号的取值限定区间;

D、给出符号分析在程序控制流图上的计算步骤;具体为:D1、根据控制流图产生时的节点序号顺序取控制流图中下一个节点作为当前节点;D2、按顺序取当前节点的下一个前驱节点为当前前驱节点;D3、判断当前前驱节点是否为分支节点,如果是,则执行步骤D4;

否则执行步骤D5;D4、采用前述步骤C中方法计算分支条件表达式对符号的取值限定区间,并将计算结果与前驱节点的符号取值区间求交,用求交后的结果更新前驱节点的符号取值区间;D5、将当前前驱节点的变量符号表达式取值和符号取值区间合并到当前节点;D6、判断当前前驱节点是否为最后一个前驱节点,如果是,则执行步骤D7;否则执行步骤D2;D7、采用前述步骤B中方法将当前节点对应语句中的表达式计算映射为相应的符号计算,更新当前节点的符号取值区间和变量符号表达式取值;D8、判断当前节点是否为控制流图的最后一个节点,如果是,则结束;否则执行步骤D1。

2.根据权利要求1所述的应用符号分析的软件测试方法,其特征在于,所述步骤A2包括:A21、将符号表达式中的项进行排序;

A22、依次取项,并将当前项化为最简;

A23、判断当前项是否为该表达式中的第一项,如果是,则执行步骤A26,否则执行步骤A24;

A24、判断当前项和上一项是否仅在于系数差别,如果是,则执行步骤A25,否则执行步骤A26;

A25、合并当前项和所述上一项,将两项的系数根据当前项对应的运算符进行加减,剩余部分保持不变;

A26、判断当前项是否为表达式的最后一项,如果是,则结束,否则执行步骤A22。

3.根据权利要求2所述的应用符号分析的软件测试方法,其特征在于,所述步骤A22包括:A221、将项中的因子进行排序;

A222、依次取因子,并将当前因子化为最简;

A223、判断当前因子是否为项中的第一个因子,如果是,则执行步骤A226,否则执行步骤A224;

A224、判断当前因子和上一因子是否只在于指数差别,如果是,则执行步骤A225,否则执行步骤A226;

A225、合并当前因子和上一个因子;

A226、判断当前因子是否为项中的最后一个因子,如果是,则结束对该项的化简过程,否则执行步骤A222。

4.根据权利要求3所述的应用符号分析的软件测试方法,其特征在于,所述步骤A222包括:A2221、从因子的最外层幂开始依次取当前幂;

A2222、判断当前幂是否为最外层幂,如果是,则执行步骤A2223,否则执行步骤A2221;

A2223、判断当前幂和上一个幂是否都为常量,如果是,执行步骤A2224,否则执行步骤A2225;

A2224、合并当前幂与上一个幂,将当前幂与上一个幂即将该两个幂进行相乘;

A2225、判断当前幂是否为最里层幂,如果是,则结束对该因子的化简过程,否则执行步骤A2221。

说明书 :

应用符号分析的软件测试方法

技术领域

[0001] 本发明涉及静态软件测试技术,尤其涉及一种应用符号分析的软件测试方法。 背景技术
[0002] 软件测试是在软件投入运行前,对软件需求分析、设计规格说明和编码实现的最终审查,是软件质量保证的关键步骤。软件测试是为了发现错误而执行程序的过程,在一个可控的软件测试环境中分析或执行程序,其根本目的是以尽可能少的时间和人力发现并改正软件中潜在的各种故障及缺陷,提高软件的质量。
[0003] 从测试过程是否需要运行被测软件的角度,可将软件测试方法分为两大类:动态测试法和静态测试法。所谓动态测试,就是通过运行软件来检验软件的动态行为和运行结果的正确性。而静态测试的基本特征是在对软件进行分析、检查和测试时不实际运行被测试的程序。动态测试和静态测试各有其优缺点:动态测试的优点是发现的软件错误非常直观,缺点是对测试用例的设计要求高,不同的测试用例集合发现错误的能力差别很大,另外,由于动态测试法需要实际运行被测程序也是一个限制。而动态测试的缺点恰恰是静态测试优点,静态测试不需要实际运行被测程序,不需要设计相关的测试用例,容易自动化,静态测试的缺点是:发现的问题往往不能完全自动确定为真正的错误,需要人工确认,所以静态测试又被称作静态分析。
[0004] 从可计算性理论的角度来看,静态分析是一个不可判定问题。提高精度是静态测试的核心问题,提高精度通常包括两个方面:减少误报(false positive)和减少漏报(false negative)。由于大量的误报会使人对测试失去信心,而漏报则会造成程序具有较高质量的假象。静态测试过程中,造成静态分析不精确的本质在于缺少程序动态执行信息,因此,怎样更好地近似表示和计算程序动态执行信息是提高精度的关键。

发明内容

[0005] 有鉴于此,本发明的主要目的在于提供一种应用符号分析的软件测试方法,结合程序中变量关联的程序动态执行信息和计算方法,用以解决程序动态执行信息的表示和处理程序中变量关联关系的技术问题,从而提高静态测试的精度。
[0006] 为达到上述目的,本发明的技术方案是这样实现的:
[0007] 一种应用符号分析的软件测试方法,该方法包括:
[0008] A、给出一个符号运算系统,包括符号表达式的表示、化简、运算和计算符号表达式的取值区间;
[0009] B、给出将程序中各变量间的具体运算映射为符号运算的步骤; [0010] C、给出程序分支语句对符号取值限定区间的计算步骤;
[0011] D、给出符号分析在程序控制流图上的计算步骤;
[0012] 其中,所述步骤A包括:
[0013] A1、符号表达式的表示方式为:每一个符号表达式由一个或多个项通过加减运算结合而成,每一个项由一个或多个因子通过乘除运算结合而成,每一个因子由一个或多个原子通过幂运算结合而成,每一个原子对应一个当前取值区间;
[0014] A2、符号表达式的化简方式为:首先将每一个因子化为最简,然后将每一个项化为最简,最后将整个表达式化为最简;
[0015] A3、符号表达式的运算包括符号表达式之间加、减、乘、除运算;所述符号表达式运算的输入和输出均为化简后的表达式;
[0016] A4、根据符号表达式中各符号的当前取值区间,通过区间运算求得符号表达式的取值区间。
[0017] 所述步骤A2包括:
[0018] A21、将符号表达式中的项进行排序;
[0019] A22、依次取项,并将当前项化为最简;
[0020] A23、判断当前项是否为该表达式中的第一项,如果是,则执行步骤A26,否则执行步骤A24;
[0021] A24、判断当前项和上一项是否仅在于系数差别,如果是,则执行步骤A25,否则执行步骤A26;
[0022] A25、合并当前项和所述上一项,将两项的系数根据当前项对应的运算符进行加减,剩余部分保持不变;
[0023] A26、判断当前项是否为表达式的最后一项,如果是,则结束,否则执行步骤A22。 [0024] 所述步骤A22包括:
[0025] A221、将项中的因子进行排序;
[0026] A222、依次取因子,并将当前因子化为最简;
[0027] A223、判断当前因子是否为项中的第一个因子,如果是,则执行步骤A226,否则执行步骤A224;
[0028] A224、判断当前因子和上一因子是否只在于指数差别,如果是,则执行步骤A225,否则执行步骤A226;
[0029] A225、合并当前因子和上一个因子;
[0030] A226、判断当前因子是否为项中的最后一个因子,如果是,则结束对该项的化简过程,否则执行步骤A222。
[0031] 所述步骤A222包括:
[0032] A2221、从因子的最外层幂开始依次取当前幂;
[0033] A2222、判断当前幂是否为最外层幂,如果是,则执行步骤A2223,否则执行步骤A2221;
[0034] A2223、判断当前幂和上一个幂是否都为常量,如果是,执行步骤A2224,否则执行步骤A2225;
[0035] A2224、合并当前幂与上一个幂,将当前幂与上一个幂即将该两个幂进行 相乘; [0036] A2225、判断当前幂是否为最里层幂,如果是,则结束对该因子的化简过程,否则执行步骤A2221。
[0037] 所述步骤B包括:
[0038] B1、将程序中的最基本的变量和常量的当前取值都由一个符号表达式来表示; [0039] B2、将程序中各种基本表达式的运算映射为符号运算系统上的运算,程序中各种表达式,包括算术表达式、关系表达式、布尔表达式、位运算表达式、赋值表达式和条件表达式。
[0040] 所述步骤C包括:
[0041] C1、取分支语句中判断条件表达式为当前表达式;
[0042] C2、判断当前表达式类型,如果为基本关系表达式,则执行步骤C3;否则执行步骤C4;
[0043] C3、计算当前表达式对符号的取值限定区间,然后结束;
[0044] C4、将当前表达式进行分解为若干子表达式;
[0045] C5、依次取子表达式为当前表达式;
[0046] C6、判断当前表达式类型,如果为基本关系表达式,则执行步骤C7;否则执行步骤C8;
[0047] C7、计算当前表达式对符号的取值限定区间;
[0048] C8、递归分解计算当前表达式对符号的取值限定区间;
[0049] C9、判断当前表达式是否为最后一个子表达式,如果是,则执行步骤C10;否则执行步骤C5;
[0050] C10、根据各子表达式计算结果求得表达式对符号的取值限定区间。 [0051] 所述步骤D包括:
[0052] D1、根据控制流图产生时的节点序号顺序取控制流图中下一个节点作为当前节点;
[0053] D2、按顺序取当前节点的下一个前驱节点为当前前驱节点;
[0054] D3、判断当前前驱节点是否为分支节点,如果是,则执行步骤D4;否则执行步骤D5;
[0055] D4、采用前述步骤C中方法计算分支条件表达式对符号的取值限定区间,并将计算结果与前驱节点的符号取值区间求交,用求交后的结果更新前驱节点的符号取值区间; [0056] D5、将当前前驱节点的变量符号表达式取值和符号取值区间合并到当前节点; [0057] D6、判断当前驱节点是否为最后一个前驱节点,如果是,则执行步骤D7;否则执行步骤D2;
[0058] D7、采用前述步骤B中方法将当前节点对应语句中的表达式计算映射为相应的符号计算,更新当前节点的符号取值区间和变量符号表达式取值;
[0059] D8、判断当前节点是否为控制流图的最后一个节点,如果是,则结束;否者执行步骤D1。
[0060] 本发明所提供的应用符号分析的软件测试方法,具有以下优点: [0061] 在软件静态测试中应用符号分析的方法时,由于采用符号表达式来表示变量的取值信息、将程序中实际变量间的运算映射为符号表达式之间的运算、计算分支语句对符号的取值区间限定、并将符号分析其应用在程序对应的控制流图上、根据控制流图节点上变量的符号表达式取值和各符号的当前取值区间,能够通过区间运算最终准确地计算出程序中每个位置上的变量取值范围。因此,能够利用准确的变量取值信息帮助提高静态测试的准确性。

附图说明

[0062] 图1为本发明化简符号表达式的实现流程示意图;
[0063] 图2为本发明化简一个项的实现流程示意图;
[0064] 图3为本发明化简一个因子的实现流程示意图;
[0065] 图4为本发明计算程序分支语句对符号取值区间限定的实现流程示意图; [0066] 图5为本发明在程序控制流上进行符号分析的实现流程示意图。 具体实施方式
[0067] 下面结合附图及本发明的实施例对本发明的方法作进一步详细的说明。 [0068] 在本发明的软件测试方法中,并不实际运行被测程序,被测程序中的变量及表达式的取值情况大多是未知的,在传统的静态测试中,由于很难得到变量的取值信息,会导致测试结果准确率不高。区间可用于表示一个变量或表达式的可能取值范围,但通常的区间运算没有考虑变量之间的关联关系,将会导致变量或表达式的取值范围计算不准确。本发明提出在静态测试中应用符号分析的方式来处理所涉及变量之间的关联关系,能够提高变量和表达式取值范围计算的准确性。
[0069] 使用符号表达式来表示程序中变量和表达式的取值,符号表达式中的每个符号对应一个取值区间。根据某个程序位置上变量的符号表达式取值和各符号的当前取值区间,通过区间运算最终能够准确地计算出该位置上的变量取值范围。
[0070] 为了在实现本发明提出的在静态测试中应用符号分析的方法,本发明给出一个符号运算系统,包括符号表达式的表示、化简、运算和计算符号表达式的取值区间。该符号运算系统由如下要素构成,其各要素定义如下:
[0071] 构成符号表达式的最基本元素可称为原子,原子不能再分解,它可以是一个数值常量,也可以是一个符号变量,原子对应一个当前取值区间。常量原子的区间值即为该常量的值,符号原子的取值区间需要根据当前程序位置决定。例如:2,x可以是原子,2的取值区间为[2,2],x的取值区间需要根据当前程序位置决定。
[0072] 一个或多个原子通过幂运算构成因子,例如:2,23,x2,xy。因子的最外层常数幂称作指数,如果没有最外层常数幂,则指数为1。
[0073] 一个或多个因子通过乘除运算结合构成项,例如:x2,2x/y。可以对项中的因子按照第一个字符的字典顺序进行排序。项中的第一个常数因子称为系数,如果没有常数因子,则系数为1。
[0074] 一个或多个项通过加减运算结合构成符号表达式,例如:2x,2x+xy。可以对符号表达式中的项按照第一个字符的字典顺序进行排序。
[0075] 图1为对一个符号表达式进行化简的实现过程示意图,如图1所示,该过程包括: [0076] 步骤1、将符号表达式中的项进行排序;
[0077] 步骤2、依次取项,并将当前项化为最简;
[0078] 步骤3、判断当前项是否为该表达式中的第一项,如果是,则执行步骤6,否则执行步骤4;
[0079] 步骤4、判断当前项和上一项是否仅在于系数差别,如果是,则执行步骤5,否则执行步骤6;
[0080] 步骤5、合并当前项和所述上一项;
[0081] 这里,所述合并的具体过程为:将两项的系数根据当前项对应的运算符进行加减,剩余部分保持不变。
[0082] 步骤6、判断当前项是否为表达式的最后一项,如果是,则结束该化简过程,否则返回执行步骤2。
[0083] 其中,上述步骤2中,将当前项进一步化为最简的具体过程如图2所示,该过程包括如下步骤:
[0084] 步骤21、将项中的因子进行排序;
[0085] 步骤22、依次取因子,并将当前因子化为最简;
[0086] 步骤23、判断当前因子是否为项中的第一个因子,如果是,则执行步骤26,否则执行步骤24;
[0087] 步骤24、判断当前因子和上一因子是否仅在于指数差别,如果是,则执行步骤25,否则执行步骤26;
[0088] 步骤25、合并当前因子和上一个因子;
[0089] 这里,所述合并的具体过程为:将两个因子的指数根据当前因子对应的运算符进行加减,剩余部分保持不变。
[0090] 步骤26、判断当前因子是否为项中的最后一个因子,如果是,则结束对该 项的化简过程,否则执行步骤22。
[0091] 其中,上述步骤22中,将当前因子化为最简的具体过程如图3所示,该过程包括如下步骤:
[0092] 步骤221、从因子的最外层幂开始依次取当前幂;
[0093] 步骤222、判断当前幂是否为最外层幂,如果是,则执行步骤223,否则执行步骤221;
[0094] 步骤223、判断当前幂和上一个幂是否都为常量,如果是,执行步骤224,否则执行步骤225;
[0095] 步骤224、合并当前幂与上一个幂;
[0096] 这里,具体的合并过程为:将当前幂与上一个幂即将该两个幂进行相乘。 [0097] 步骤225、判断当前幂是否为最里层幂,如果是,则结束对该因子的化简过程,否则执行步骤221。
[0098] 在如上所述符号表达式化简的基础上,可以再进一步实现符号表达式的基本运算,包括加、减、乘、除。符号表达式运算的输入和输出都是化简了的表达式。 [0099] 加法运算A+B:将A的所有项和B的所有项取并集再化简;
[0100] 减法运算A-B:将B中每一项的运算符取反后和A的项取并集再化简; [0101] 乘法运算A*B:将A中每一项分别乘以B中每一项后取并集再化简; [0102] 乘法运算A/B:将A中每一项分别乘以B中每一项的倒数后,取并集再化简; [0103] 对一个给定的符号表达式,可以根据所述符号表达式中各符号的当前取值区间,通过区间运算求得符号表达式的取值区间。其计算过程即为将每个符号的区间代入表达式进行区间运算。
[0104] 为了实现本发明所提出的在静态测试中应用符号分析的方法,本发明提出了一种将程序中各变量间的具体运算映射为符号运算的方法:
[0105] 程序中变量间的具体运算在语法上表现为各种表达式,针对所有类型的表达式,将具体的运算映射为符号运算,则实现了将整个程序中变量间的具体运 算映射为符号运算的过程。各类型表达式对应符号运算规则如下:
[0106] 常量:返回包含一个常量原子的符号表达式;
[0107] 变量:判断变量的当前符号取值,如果为空则返回一个新符号;否则返回变量的当前符号取值;
[0108] 算术表达式:其运算符包括+、-、*、/、%,
[0109] A+B:返回(A的符号取值)+(B的符号取值),
[0110] A-B:返回(A的符号取值)-(B的符号取值),
[0111] A*B:返回(A的符号取值)*(B的符号取值),
[0112] A/B:返回(A的符号取值)/(B的符号取值),
[0113] A%B:如果A、B的符号取值都为常量,则返回(A的符号取值)%(B的符号取值),否则返回一个新符号;
[0114] 关系表达式:其运算符包括>、>=、==、!=、<、<=, [0115] A>B:取(A-B)对应符号取值的区间值R,如果R>0则返回符号常量1,如果R<=0则返回符号常量0,否则返回一个新符号,其对应区间为[0,1], [0116] A>=B:取(A-B)对应符号取值的区间值R,如果R>=0则返回符号常量1,如果R<0则返回符号常量0,否则返回一个新符号,其对应区间为[0,1], [0117] A<B:取(A-B)对应符号取值的区间值R,如果R<0则返回符号常量1,如果R>=0则返回符号常量0,否则返回一个新符号,其对应区间为[0,1], [0118] A<=B:取(A-B)对应符号取值的区间值R,如果R<=0则返回符号常量1,如果R>0则返回符号常量0,否则返回一个新符号,其对应区间为[0,1], [0119] A==B:取(A-B)对应符号取值的区间值R,如果R=[0,0]则返回符号常量1,如果R不包含0则返回符号常量0,否则返回一个新符号,其对应区间为[0,1], [0120] A!=B:取(A-B)对应符号取值的区间值R,如果R不包含0则返回符号常量1,如果R=[0,0]则返回符号常量0,否则返回一个新符号,其对应区间为[0,1]; [0121] 布尔表达式:其运算符包括&&、||、!,
[0122] A&&B:取A和B对应符号取值的区间值R1、R2,如果R1不包含0且R2不包含0则返回符号常量1,如果R1=[0,0]或R2=[0,0]则返回符号常量0, 否则返回一个新符号,其对应区间为[0,1],
[0123] A||B:取A和B对应符号取值的区间值R1、R2,如果R1不包含0或R2不包含0则返回符号常量1,如果R1=[0,0]且R2=[0,0]则返回符号常量0,否则返回一个新符号,其对应区间为[0,1],
[0124] !A:取A对应符号取值的区间值R,如果R不包含0则返回符号常量0,如果R1=[0,0]则返回符号常量1,否则返回一个新符号,其对应区间为[0,1]; [0125] 位运算表达式:运算符包括>>、>>、<<、|、&、^、~, [0126] A>>B:取A和B对应符号取值的区间值R1、R2,如果R1只包含单数值r1且R2只包含单数值r2,则返回符号常量r1>>r2,否则返回一个新符号,
[0127] A<<B:取A和B对应符号取值的区间值R1、R2,如果R1只包含单数值r1且R2只包含单数值r2,则返回符号常量r1<<r2,否则返回一个新符号,
[0128] A|B:取A和B对应符号取值的区间值R1、R2,如果R1只包含单数值r1且R2只包含单数值r2,则返回符号常量r1|r2,否则返回一个新符号,
[0129] A&B:取A和B对应符号取值的区间值R1、R2,如果R1只包含单数值r1且R2只包含单数值r2,则返回符号常量r1&r2,否则返回一个新符号,
[0130] A^B:取A和B对应符号取值的区间值R1、R2,如果R1只包含单数值r1且R2只包含单数值r2,则返回符号常量r1^r2,否则返回一个新符号,
[0131] ~A:取A对应符号取值的区间值R1,如果R1只包含单数值r1,则返回符号常量~r1,否则返回一个新符号;
[0132] 赋值表达式:运算符包括=、+=、-=、*=、/=、%=、<<=、>>=、|=、&=、^=、++、--,
[0133] A=B:将A的符号取值更新为B对应的符号取值,
[0134] A+=]3:将A的符号取值更新为(A+B)对应的符号取值,
[0135] A-=B:将A的符号取值更新为(A-B)对应的符号取值,
[0136] A*=B:将A的符号取值更新为(A*B)对应的符号取值,
[0137] A/=B:将A的符号取值更新为(A/B)对应的符号取值,
[0138] A%=B:将A的符号取值更新为(A%B)对应的符号取值,
[0139] A<<=B:将A的符号取值更新为(A<<B)对应的符号取值,
[0140] A>>=B:将A的符号取值更新为(A>>B)对应的符号取值,
[0141] A|=B:将A的符号取值更新为(A|B)对应的符号取值,
[0142] A&=B:将A的符号取值更新为(A&B)对应的符号取值,
[0143] A^=B:将A的符号取值更新为(A^B)对应的符号取值,
[0144] A++:将A的符号取值更新为(A+1)对应的符号取值,
[0145] A--:将A的符号取值更新为(A-1)对应的符号取值;
[0146] 条件表达式:运算符为?,
[0147] A?B:C:取A对应符号取值的区间值R,如果R不包含0则返回B对应的符号取值,如果R1=[0,0]则返回C对应的符号取值,否则返回一个新符号,其对应区间为B、C对应符号取值的区间值R1、R2的并-R1∪R2。
[0148] 程序代码中除了带初始化的声明语句和赋值语句会影响变量的取值情况外,分支语句上的条件判断也会对变量的取值在不同分支进行限定。为了实现本发明提出的静态测试中应用符号分析的方法,本发明还给出一种计算程序分支语句对符号的取值限定区间的方法,如图4所示,该方法包括:
[0149] 步骤401、取分支语句中判断条件表达式作为当前表达式;
[0150] 步骤402、判断当前表达式类型,如果为基本关系表达式,则执行步骤403,否则执行步骤404;
[0151] 步骤403、计算当前表达式对符号取值限定区间,然后结束;
[0152] 步骤404、将当前表达式进行分解为若干子表达式;
[0153] 步骤405、依次取所述子表达式为当前表达式;
[0154] 步骤406、判断当前表达式类型,如果为基本关系表达式,则执行步骤407;否则执行步骤408;
[0155] 步骤407、计算当前表达式对符号的取值限定区间;
[0156] 步骤408、递归分解计算当前表达式对符号的取值限定区间;
[0157] 步骤409、判断当前表达式是否为最后一个子表达式,如果是,则执行步骤410,否则执行步骤405;
[0158] 步骤410、根据各子表达式计算结果求得表达式对符号的取值限定区间。 [0159] 本发明在软件静态测试中应用符号分析的目的,是为了精确地计算每个程序位置上的变量取值信息,进而可以在静态测试过程中充分利用这些信息来提高静态测试的精度。为了在实现本发明提出的在静态测试中应用符号分析的方法,本发明还提出了一种将符号分析在程序控制流图上的计算方法,如图5所示。
[0160] 程序控制流图是对程序控制结构的图形表示,它是一种有向图。通常一个程序的控制流图可表示为(N,E,Entry,Exit)。其中:N代表节点的集合,反映程序中的简单顺序语句和复合语句的条件判断分支点以及汇合点;E代表有向边的集合,反映程序中语句间的控制流关系;Entry为唯一入口节点;Exit为唯一的出口节点。
[0161] 控制流图中的每个节点都和实际程序语句相对应,控制流图中的节点包含三类:控制流顺序传递节点,具体和简单顺序语句对应;控制流分离的分支节点,具体对应分支和循环语句的条件判断程序点;控制流汇合的连接节点,具体对应分支和循环语句结束时的不同分支合并程序点和转跳语句的目标程序点。
[0162] 本发明提出的将符号分析应用在程序控制流图上的计算方法,该方法在每个控制流节点上计算各变量的符号取值和各符号的当前取值区间,该方法如图5所示,包括如下步骤:
[0163] 步骤501、根据控制流图产生时的节点序号顺序取控制流图中下一个节点作为当前节点;
[0164] 步骤502、按顺序取当前节点的下一个前驱节点为当前前驱节点; [0165] 步骤503、判断当前前驱节点是否为分支节点,如果是,则执行步骤504;否则执行步骤505;
[0166] 步骤504、采用前述方法计算分支条件表达式对各符号的取值限定区间,并将计算结果与前驱节点的各符号取值区间求交,用求交后的结果更新前驱节点的各符号取值区间;
[0167] 步骤505、将当前前驱节点的各变量符号表达式取值和各符号取值区间合并到当前节点;
[0168] 步骤506、判断当前驱节点是否为最后一个前驱节点,如果是,则执行步骤507;否则执行步骤502;
[0169] 步骤507、采用前述方法将当前节点对应语句中的表达式计算映射为相应的符号计算,更新当前节点的各符号取值区间和各变量符号表达式取值;
[0170] 步骤508、判断当前节点是否为控制流图的最后一个节点,如果是,则结束;否者执行步骤501。
[0171] 以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。