CN102662829B - 一种复杂数据结构在代码静态测试中的处理方法和装置 - Google Patents
一种复杂数据结构在代码静态测试中的处理方法和装置 Download PDFInfo
- Publication number
- CN102662829B CN102662829B CN201210071743.9A CN201210071743A CN102662829B CN 102662829 B CN102662829 B CN 102662829B CN 201210071743 A CN201210071743 A CN 201210071743A CN 102662829 B CN102662829 B CN 102662829B
- Authority
- CN
- China
- Prior art keywords
- data type
- type
- basic data
- array
- pointer
- 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)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种复杂数据结构在代码静态测试中的处理方法,在符号表中记录与复杂数据类型相关的基本数据类型信息;对控制流图的每个节点的复杂数据类型,根据与所述复杂数据类型相关的基本数据类型信息进行基本数据类型拆分,将基本数据类型拆分后得到的每个独立变量进行独立分析,更新相应的控制流图节点信息;输出更新后的控制流图;本发明同时还公开了一种复杂数据结构在代码静态测试中的处理装置,通过本发明的方案,能够解决静态测试中对复杂数据类型整体建模分析不完善所产生的漏报问题,在一定程度上提高静态测试的精度。
Description
技术领域
本发明涉及软件测试技术,尤其涉及一种复杂数据结构在代码静态测试中的处理方法和装置。
背景技术
软件测试是一种软件质量保证活动,其动机是通过一些经济有效的方法,发现软件中存在的缺陷,从而保证软件质量。软件测试通常从两个方面进行,即动态测试和静态测试。在动态测试中,需要根据实际状况,设计多组测试用例,并通过实际运行被测程序来检测程序的动态行为和运行结果的正确性;静态测试则是扫描源程序,从中找出可能导致错误的结构异常、控制流异常及数据流异常。静态测试较动态测试而言,成本低、容易实现、能覆盖所有路径、且不依赖于特定的运行环境,所以静态测试技术正逐渐受到软件业界的青睐,已成为美国的一种主流的软件测试技术。目前具有代表性的代码缺陷静态测试工具主要有斯坦福(Stanford)大学的研究项目Metal、Maryland大学研发的Java程序静态测试工具FindBugs、开源的Java程序静态测试工具PMD、美国Klocwork公司研发的代码缺陷检测工具K8。
目前主流的编程语言风格主要分为面向过程和面向对象两大类,对于静态测试过程来说,国内外现有工具对基本数据类型变量相关的缺陷检测已经具有了一定程度的精度保证,而对于与复杂数据类型相关的一些缺陷检测对象,如结构体成员访问、类成员函数的调用等,则由于对该类缺陷检测对象整体抽象建模难以实现,使得数据流计算过程中很难实现域敏感分析,降低了分析精度。
发明内容
有鉴于此,本发明的主要目的在于提供一种复杂数据结构在代码静态测试中的处理方法和装置,能够解决静态测试中对复杂数据类型整体建模分析不完善所产生的漏报问题,在一定程度上提高静态测试的精度。
为达到上述目的,本发明的技术方案是这样实现的:
本发明提供了一种复杂数据结构在代码静态测试中的处理方法,该方法包括:
在符号表中记录与复杂数据类型相关的基本数据类型信息;
对控制流图的每个节点的复杂数据类型,根据与所述复杂数据类型相关的基本数据类型信息进行基本数据类型拆分,将基本数据类型拆分后得到的每个独立变量进行独立分析,更新相应的控制流图节点信息;
输出更新后的控制流图。
上述方案中,所述复杂数据类型包括:结构体、类、数组和复杂指针。
上述方案中,所述记录与复杂数据类型相关的基本数据类型信息为:记录与结构体相关的基本数据类型信息,包括:建立结构体类型模型实例,在结构体类型模型实例中,用哈希表(Hashtabel<image,Type>)记录结构体成员变量的相应类型(Type)和名称(image);用动态数组(ArrayList<image>)记录结构体成员变量的出现顺序;当结构体成员变量的类型为其他复杂数据类型时,Type值为所述其他复杂数据类型相应的类型模型实例;
记录与类相关的基本数据类型信息,包括:建立类类型模型实例,在类类型模型实例中主要包括:1)用Hashtabel<image,Type>记录成员变量名和成员变量类型信息;2)用Hashtabel<image,Summary>记录成员函数的函数名及其对应的函数摘要(Summary),若为虚函数,则不予记录;3)用ArrayList<Type>记录父类类型信息;
记录与数组和复杂指针相关的基本数据类型信息,包括:只记录数组和复杂指针的成员变量的单独声明类型。
上述方案中,所述根据与所述复杂数据类型相关的基本数据类型信息进行基本数据类型拆分为:
所述复杂数据类型为结构体时,利用符号表中记录的与结构体相关的基本数据类型信息,逐一遍历结构体成员,在结构体成员类型为基本数据类型时,对所述结构体成员进行独立变量声明;在结构体成员类型为复杂数据类型时,对所述结构体成员递归进行基本数据类型拆分;
所述复杂数据类型为类时,利用符号表中记录的与类相关的基本数据类型信息,逐一遍历类成员,在所述类成员类型为基本数据类型时,对所述类成员进行独立变量声明;在类成员类型为复杂数据类型时,对该类成员类型递归进行基本数据类型拆分;
所述复杂数据类型为数组时,利用符号表中记录的与数组相关的基本数据类型信息,查找所有数组长度确定的数组声明,在所述数组声明的数组类型为基本数据类型时,按照基本数据类型对所述数组进行独立变量声明;在数组类型为复杂数据类型时,对该数组类型递归进行基本数据类型拆分;
所述复杂数据类型为复杂指针时,利用符号表中记录的与复杂指针相关的基本数据类型信息,查找所有复杂指针声明,当复杂指针声明为多级指针时,对不指向结构体的每一级指针做独立变量声明;当复杂指针声明为指向结构体的指针或多级指针的最后一级指针为指向结构体的指针时,对所述指针指向的结构体进行基本数据类型拆分。
本发明提供的一种复杂数据结构在代码静态测试中的处理装置,该装置包括:符号表模块、基本数据类型拆分模块、分析更新模块、输出模块;其中,
符号表模块,用于在符号表中记录与复杂数据类型相关的基本数据类型信息;
基本数据类型拆分模块,用于对控制流图的每个节点的复杂数据类型,根据与所述复杂数据类型相关的基本数据类型信息进行基本数据类型拆分,将基本数据类型拆分后得到的每个独立变量通知给分析更新模块;
分析更新模块,用于将基本数据类型拆分后得到的每个独立变量进行独立分析,更新相应的控制流图节点信息;
输出模块,用于输出更新后的控制流图。
上述方案中,所述符号表模块,具体用于在符号表中记录与结构体、类、数组和复杂指针相关的基本数据类型信息。
上述方案中,所述基本数据类型拆分模块,具体用于利用符号表中记录的与结构体相关的基本数据类型信息,逐一遍历结构体成员,在结构体成员类型为基本数据类型时,对所述结构体成员进行独立变量声明;在结构体成员类型为复杂数据类型时,对该结构体成员递归进行基本数据类型拆分。
上述方案中,所述基本数据类型拆分模块,具体还用于利用符号表中记录的与类相关的基本数据类型信息,逐一遍历类成员,在所述类成员类型为基本数据类型时,对所述类成员进行独立变量声明;在类成员类型为复杂数据类型时,对该类成员类型递归进行基本数据类型拆分。
上述方案中,所述基本数据类型拆分模块,具体还用于利用符号表中记录的与数组相关的基本数据类型信息,查找所有数组长度确定的数组声明,在所述数组声明的数组类型为基本数据类型时,按照基本数据类型对所述数组进行独立变量声明;在数组类型为复杂数据类型时,对该数组类型递归进行基本数据类型拆分。
上述方案中,所述基本数据类型拆分模块,具体还用于利用符号表中记录的与复杂指针相关的基本数据类型信息,查找所有复杂指针声明,当复杂指针声明为多级指针时,对不指向结构体的每一级指针做独立变量声明;当复杂指针声明为指向结构体的指针或多级指针的最后一级指针为指向结构体的指针时,对所述指针指向的结构体进行基本数据类型拆分。
本发明提供了一种复杂数据结构在代码静态测试中的处理方法和装置,在符号表中记录与复杂数据类型相关的基本数据类型信息;按照控制流图节点次序依次对每个节点的复杂数据类型进行基本类型拆分,将基本类型拆分后得到的独立成员变量进行分析,并更新相应的控制流图节点信息;输出更新后的控制流图;如此,能够解决静态测试中对复杂数据类型整体建模分析不完善所产生的漏报问题,在一定程度上提高静态测试的精度。
附图说明
图1为本发明实现复杂数据结构在代码静态测试中的处理方法的流程示意图;
图2为本发明实现复杂数据结构在代码静态测试中的处理装置的结构示意图;
图3为本发明实施例一实现复杂数据结构在代码静态测试中的处理方法的流程示意图;
图4为本发明实施例一中步骤A的具体流程示意图;
图5为本发明实施例一中步骤E的具体流程示意图;
图6为本发明实施例一中步骤G的具体流程示意图;
图7为本发明实施例一中步骤I的具体流程示意图;
图8为本发明实施例一中步骤K的具体流程示意图。
具体实施方式
现有软件静态测试技术为了得到更高的测试精度,常采用一种在控制流上进行区间集运算的方法,这种方法模拟程序执行时控制流图节点上变量的取值情况,用一个变量或表达式的可能取值范围来表示其实际执行时的取值,但通常的区间集运算对象只是基本数据类型,对于复杂数据类型的区间集模型抽象,具体到成员的访问是无法实现的,导致成员变量取值范围无法计算和相关的缺陷模式计算不准确,产生大量漏报。
例如下列片段:
基于上面的例子,明显的看到,str1在数据流分析时的可能取值情况有两种,如果对结构体进行整体建模,可以很好的记录下结构体变量在程序实际执行时可能的取值情况,但对于静态分析而言,对结构体整体进行模型抽象是很难实现的,而且,若将结构体整体的区间模型作为数据流的分析对象,每分析到成员变量时都会对结构体的整体区间模型进行访问,这会导致分析效率的下降。如果换一种分析模式,将结构体变量拆分成具体的成员变量去执行数据流分析,对于上述代码片段,在程序结尾处结构体成员变量str1.a的取值区间为[0,1]、str1.b的取值区间为[0,1],由于在成员变量独立分析时其关联关系丢失,就导致结构体整体取值范围的情况由实际的两种变成了四种。
考虑基于缺陷模式描述的软件静态测试机制,其常见缺陷的分析对象均为基本数据类型,例如空指针的解引用、资源泄漏、非法计算等,所以除了一些和复杂数据类型关联性相关的一些特殊缺陷模式以外,这种成员独立分析的方法在测试精度上是没有信息丢失的。对于上述程序片段中的int a=1/str1.a,即使对str1变量进行了完整建模,在具体进行非法计算模式分析时也要具体到成员变量的取值,其值和独立分析成员变量str1.a是相同的。
本发明中复杂数据类型包括结构体、类、多级指针和数组,任意一个复杂数据类型变量的基本数据类型拆分定义如下:在变量声明时,根据变量实例的定义,对复杂数据类型的所有成员进行遍历声明,若成员类型仍为复杂数据类型,则进行递归拆分直至成员变量类型均为基本数据类型为止。
本发明的基本思想是:在符号表中记录与复杂数据类型相关的基本数据类型信息;按照控制流图节点次序依次对每个节点的复杂数据类型进行基本数据类型拆分,将基本数据类型拆分后得到的成员变量进行独立分析,更新相应的控制流图节点信息;输出更新后的控制流图。
下面通过附图及具体实施例对本发明做进一步的详细说明。
本发明实现一种复杂数据结构在代码静态测试中的处理方法,如图1所示,该方法包括以下几个步骤:
步骤101:在符号表中记录与复杂数据类型相关的基本数据类型信息;
本步骤所述复杂数据类型包括:结构体、类、数组、复杂指针(多级指针和指向结构体的指针)等,其中,所述记录与结构体相关的基本数据类型信息,可以是:建立结构体类型模型实例,在结构体类型模型实例中,用哈希表(Hashtabel<image,Type>)记录结构体成员变量的相应类型(Type)和名称(image),在后面的结构体实例过程中用于对成员进行独立变量声明;用动态数组(ArrayList<image>)记录结构体成员变量的出现顺序;当结构体成员变量的类型为其他复杂数据类型时,Type值为所述其他复杂数据类型相应的类型模型实例;
所述记录与类相关的基本数据类型信息,可以是:建立类类型模型实例,在类类型模型实例中主要包括:1)用Hashtabel<image,Type>记录成员变量名和成员变量类型信息;2)用Hashtabel<image,Summary>记录成员函数的函数名及其对应的函数摘要(Summary),若为虚函数,则不予记录;3)用ArrayList<Type>记录父类类型信息;
所述记录与数组和复杂指针相关的基本数据类型信息,可以是:只记录数组和复杂指针的成员变量的单独声明类型即可。
步骤102:对控制流图的每个节点的复杂数据类型,根据与所述复杂数据类型相关的基本数据类型信息进行基本数据类型拆分,将基本数据类型拆分后得到的每个独立变量进行独立分析,更新相应的控制流图节点信息;
本步骤中,所述复杂数据类型为结构体时,根据符号表中记录的与结构体相关的基本数据类型信息进行基本数据类型拆分的方法为:利用符号表中记录的与结构体相关的基本数据类型信息,逐一遍历结构体成员,在结构体成员类型为基本数据类型时,对所述结构体成员进行独立变量声明,其中,独立变量类型为所述结构体成员类型,独立变量名为结构体名+“.”+成员名;在结构体成员类型为复杂数据类型时,对该结构体成员递归进行基本数据类型拆分;
所述复杂数据类型为类时,根据符号表中记录的与类相关的基本数据类型信息进行基本数据类型拆分的方法为:利用符号表中记录的与类相关的基本数据类型信息,逐一遍历类成员,在所述类成员类型为基本数据类型时,对所述类成员进行独立变量声明,其中,独立变量类型为所述类成员类型,独立变量名为对象名+“.”+成员名;在类成员类型为复杂数据类型时,对该类成员类型递归进行基本数据类型拆分;
所述复杂数据类型为数组时,根据符号表中记录的与数组相关的基本数据类型信息进行基本数据类型拆分的方法为:利用符号表中记录的与数组相关的基本数据类型信息,查找所有数组长度确定的数组声明,在所述数组声明的数组类型为基本数据类型时,按照基本数据类型对所述数组进行独立变量声明,其中,独立变量类型为所述数组类型,独立变量名为数组名+[下标];在数组类型为复杂数据类型时,对该数组类型递归进行基本数据类型拆分;
所述复杂数据类型为复杂指针时,根据符号表中记录的与复杂指针相关的基本数据类型信息进行基本数据类型拆分的方法为:利用符号表中记录的与复杂指针相关的基本数据类型信息,查找所有复杂指针声明,当复杂指针声明为多级指针时,对不指向结构体的每一级指针做独立变量声明;当复杂指针声明为指向结构体的指针或多级指针的最后一级指针为指向结构体的指针时,对所述指针指向的结构体进行基本数据类型拆分。
步骤103:输出更新后的控制流图。
为了实现上述方法,本发明还提供一种复杂数据结构在代码静态测试中的处理装置,如图2所示,该装置包括:符号表模块21、基本数据类型拆分模块22、分析更新模块23、输出模块24;其中,
符号表模块21,用于在符号表中记录与复杂数据类型相关的基本数据类型信息;
所述符号表模块21,具体用于在符号表中记录与结构体、类、数组和复杂指针相关的基本数据类型信息;
基本数据类型拆分模块22,用于对控制流图的每个节点的复杂数据类型,根据与所述复杂数据类型相关的基本数据类型信息进行基本数据类型拆分,将基本数据类型拆分后得到的每个独立变量通知给分析更新模块23;
所述基本数据类型拆分模块22,具体用于利用符号表中记录的与结构体相关的基本数据类型信息,逐一遍历结构体成员,在结构体成员类型为基本数据类型时,对所述结构体成员进行独立变量声明;在结构体成员类型为复杂数据类型时,对该结构体成员递归进行基本数据类型拆分;
所述基本数据类型拆分模块22,具体还用于利用符号表中记录的与类相关的基本数据类型信息,逐一遍历类成员,在所述类成员类型为基本数据类型时,对所述类成员进行独立变量声明;在类成员类型为复杂数据类型时,对该类成员类型递归进行基本数据类型拆分;
所述基本数据类型拆分模块22,具体还用于利用符号表中记录的与数组相关的基本数据类型信息,查找所有数组长度确定的数组声明,在所述数组声明的数组类型为基本数据类型时,按照基本数据类型对所述数组进行独立变量声明;在数组类型为复杂数据类型时,对该数组类型递归进行基本数据类型拆分;
所述基本数据类型拆分模块22,具体还用于利用符号表中记录的与复杂指针相关的基本数据类型信息,查找所有复杂指针声明,当复杂指针声明为多级指针时,对不指向结构体的每一级指针做独立变量声明;当复杂指针声明为指向结构体的指针或多级指针的最后一级指针为指向结构体的指针时,对所述指针指向的结构体进行基本数据类型拆分;
分析更新模块23,用于将基本数据类型拆分后得到的每个独立变量进行独立分析,更新相应的控制流图节点信息;
输出模块24,用于输出更新后的控制流图。
下面结合具体实施例详细说明本发明的方法的实现过程和原理。
实施例一
本实施例实现一种复杂数据结构在代码静态测试中的处理方法,如图3所示,该方法包括以下几个步骤:
步骤A、在符号表中记录与复杂数据类型相关的基本数据类型信息;
步骤B、根据软件的控制流图节点次序依次取控制流图下一节点为当前节点;
步骤C、通过辅助工具生成软件对应的抽象语法树,利用生成的抽象语法树获得不同程序语句所对应的数据类型,查找出所有对应复杂数据类型的声明语句;
步骤D、判断当前节点声明语句的声明类型是否为结构体,若是,则执行步骤E;否则执行步骤F;
步骤E、根据符号表中记录的与结构体相关的基本数据类型信息进行基本数据类型拆分,将基本数据类型拆分后得到的每个独立变量进行独立分析,在更新相应控制流图节点信息后执行步骤L;
步骤F、判断当前节点声明语句的声明类型是否为类,若是,则执行步骤G;否则执行步骤H;
步骤G、根据符号表中记录的与类相关的基本数据类型信息进行基本数据类型拆分,将基本数据类型拆分后得到的每个独立变量进行独立分析,在更新相应控制流图节点信息后执行步骤L;
步骤H、判断当前节点声明语句的声明类型是否为数组,若是,则执行步骤I;否则执行步骤J;
步骤I、根据符号表中记录的与数组相关的基本数据类型信息进行基本数据类型拆分,将基本数据类型拆分后得到的每个独立变量进行独立分析,在更新相应控制流图节点信息后执行步骤L;
步骤J、判断当前节点声明语句的声明类型是否为复杂指针,若是,则执行步骤K;否则执行步骤L;
步骤K、根据符号表中记录的与复杂指针相关的基本数据类型信息进行基本数据类型拆分,将基本数据类型拆分后得到的每个独立变量进行独立分析,在更新相应控制流图节点信息后执行步骤L;
步骤L、判断当前节点是否为最后节点,若是,则执行步骤M;否则执行步骤B;
步骤M、结束遍历,输出更新后的控制流图。
上述步骤A如图4所示,具体包括以下步骤:
A1、通过辅助工具生成软件对应的抽象语法树,遍历语法树,查找与复杂数据类型相关的定义节点;
所述复杂数据类型包括:结构体、类、数组、复杂指针(多级指针和指向结构体的指针)等,其中,对于结构体和类实例化声明前,均有对其类型的具体定义,在产生的抽象语法树上可以找到相关的定义节点,访问其相应信息。
A2、判断遍历是否结束,若是,则执行步骤A7;若否,则执行步骤A3;
A3、判断查找到的定义节点是否为结构体定义,若是则执行步骤A4;否则执行步骤A5;
A4、在符号表中记录与结构体相关的基本数据类型信息;
具体的,在符号表中建立结构体类型模型实例,在结构体类型模型实例中,用哈希表(Hashtabel<image,Type>)记录结构体声明中成员变量的相应类型(Type)和名称(image),在后面的结构体实例过程中用于对成员进行独立变量声明;用动态数组(ArrayList<image>)记录结构体成员变量的出现顺序;当结构体中含有其他复杂数据类型时,Type值为所述其他复杂数据类型相应的类型模型实例;
A5、判断查找到的定义节点是否为类定义,若是则执行步骤A6;否则执行步骤A2;
A6、在符号表中记录与类相关的基本数据类型信息;
具体的,在符号表中建立类类型模型实例,在类类型模型实例中主要包括:1)用Hashtabel<image,Type>记录成员变量名和成员变量类型信息;2)用Hashtabel<image,Summary>记录成员函数的函数名及其对应的函数摘要(Summary),若为虚函数,则不予记录;3)用ArrayList<Type>记录父类类型模型实例;
A7、结束遍历语法树;
本方法还包括:对于数组和复杂指针,只需在符号表中记录成员变量的单独声明类型即可。
上述步骤E如图5所示,具体包括以下步骤:
E1、利用符号表中记录的与结构体相关的基本数据类型信息,逐一遍历结构体成员,根据结构体成员类型选择不同的独立变量声明方法;
E2、判断结构体成员遍历是否结束,若是则执行步骤E9;若否则执行步骤E3;
E3、判断结构体成员类型是否为基本数据类型,若是则执行步骤E4;否则执行步骤E5;
E4、对该结构体成员进行独立变量声明,在Hashtabel<image,Type>中查找到该结构体成员相应的键值对,独立变量类型为该结构体成员的Type,独立变量名为该结构体名+“.”+image,执行步骤E2;
E5、判断结构体成员类型是否为数组或复杂指针,若是则执行步骤E6;否则执行步骤E7;
E6、对数组和复杂指针进行基本数据类型拆分,具体拆分方法详见步骤I和步骤K,执行步骤E2;
E7、判断结构体成员类型是否为结构体,若是则执行步骤E8;否则执行步骤E2;
E8、利用符号表中记录的与结构体相关的基本数据类型信息,对所述结构体成员类型进行基本数据类型拆分,直到将结构体成员拆分成多个类型为基本数据类型的独立变量为止,执行步骤E2;
E9、遍历结束,将基本数据类型拆分后得到的每个独立变量进行独立分析,在更新相应控制流图节点信息后执行步骤L。
上述步骤G如图6所示,具体包括以下步骤:
步骤G1、利用符号表中记录的与类相关的基本数据类型信息,逐一遍历每一个类成员类型,所述类成员类型包括成员变量和成员函数;
步骤G2、判断类成员类型遍历是否结束,若是,则执行步骤G9;否则执行步骤G3;
步骤G3、判断类成员类型是否为基本数据类型,若是则执行步骤G4;否则执行步骤G5;
步骤G4、对所述类成员类型进行独立变量声明,在Hashtabel<image,Type>中查找到该类成员类型相应的键值对,独立变量类型为该类成员类型的Type,变量名为该类的名+“.”+image,在后续控制流分析时,当访问该独立变量时,不会考虑与该类的整体关联性,执行步骤G2;
步骤G5、判断结构体成员类型是否为数组或复杂指针,若是则执行步骤G6;否则执行步骤G7;
步骤G6、对数组和复杂指针进行基本数据类型拆分,具体拆分方法详见步骤I和步骤K;
步骤G7、判断成员是否为函数体,若是则执行步骤G8;否则执行步骤G2;
步骤G8、利用符号表中记录的该类成员函数的函数名及其对应的函数摘要Hashtabel<image,Summary>,对该类成员函数进行新的函数摘要计算,函数名更新为该类的名+“.”+image,并将原函数摘要关联在新的函数名上,执行步骤G2;
步骤G9、遍历完类成员类型后,再遍历ArrayList<Type>中每一个成员,在ArrayList<Type>中有父类类型信息Type时,根据父类类型信息,对父类对应的成员继续进行独立变量声明,若ArrayList<Type>中没有父类类型信息,则不予计算;
步骤G10、遍历结束,将基本数据类型拆分后得到的每个独立变量进行独立分析,在更新相应控制流图节点信息后执行步骤L。
上述步骤I如图7所示,具体包括以下步骤:
步骤I1、利用符号表中记录的与数组相关的基本数据类型信息,遍历控制流图,查找所有数组长度确定的数组声明;
步骤I2、控制流图遍历是否结束,若是则执行步骤I11;若否则执行步骤I3;
步骤I3、判断所述数组声明的数组成员类型是否为基本数据类型,若是则执行步骤I4;否则执行步骤I5;
步骤I4、对每个数组成员进行独立变量声明,独立变量类型为该数组类型,独立变量名为数组名+[下标],在后续控制流分析时,当访问该独立变量时,不会考虑与数组整体的关联性;
步骤I5、判断数组成员类型是否为结构体,若是则执行步骤I6;否则执行步骤I7;
步骤I6、根据数组成员的类型信息,对每个数组成员类型进行结构体的基本数据类型拆分,将基本数据类型拆分后得到的独立变量声明为数组名+[下标]+“.”+数组成员名,执行步骤I2;
步骤I7、判断数组成员类型是否为复杂指针,若是则执行步骤I8;否则执行步骤I9;
步骤I8、对每个数组成员进行复杂指针的基本类型拆分,详见步骤K;
步骤I9、判断数组成员类型是否为数组,若是则执行步骤I10;否则执行步骤I2;
步骤I10、对每个数组成员类型递归进行数组的基本类型拆分执行步骤I2;
步骤I11、遍历结束,将基本数据类型拆分后得到的每个独立变量进行独立分析,在更新相应控制流图节点信息后执行步骤L。
进一步的,上述方法还包括:当数组的下标在数据流分析时可静态计算出时,则称其为可确定数组元素,对于可确定数组元素,可以通过静态分析得到的下标取值查找相应的独立变量声明,进一步的,还可以对所述数组元素相应的数组成员变量更新区间集信息。
上述步骤K如图8所示,具体包括以下步骤:
步骤K1、利用符号表中记录的与复杂指针相关的基本数据类型信息,遍历控制流图,查找所有复杂指针声明,主要包括指向结构体的指针和多级指针;
步骤K2、控制流图遍历是否结束,若是则执行步骤K9;若否则执行步骤K3;
步骤K3、判断指针是否为多级指针,若是则执行步骤K4;否则执行步骤K6;
步骤K4、对于多级指针,除最后一级指针外,对每一级指针做独立变量声明,其中,指针类型模型用originalType来描述指针指向的类型信息,例如对于声明int***p,p和*p的originalType仍为Pointer,所以*p和**p仍为一个指针,其中**p的originalType为int,所以***p的类型为整形。这里的最后一级指针为**p,所以只对p和*p进行变量声明;
步骤K5、判断最后一级指针是否指向结构体,若是则执行步骤K7;否则执行步骤K8;
步骤K6、判断指针是否指向结构体,若是则执行步骤K7,否则执行步骤K2;
步骤K7、对指针指向的结构体进行基本类型拆分,其中,对于指针的基本类型拆分只需将结构体的基本类型拆分中的“.”替换成“->”即可;
步骤K8、对最后一级指针和指针解引用分别做独立变量声明,执行步骤K2;
步骤K9、遍历结束,将基本数据类型拆分后得到的每个独立变量进行独立分析,在更新相应控制流图节点信息后执行步骤L。
下面给出一段程序代码,结合本发明的基本数据类型拆分算法,说明本发明在软件静态测试中的具体应用。
以下面的代码片段为例:
1:void f(){
2:int*p1=(int*)malloc(sizeof(int));
3:*p1=0;//NPD
4:int**p2=&p1;
5:**p2=0;//NPD false negative}
原有框架对空指针故障(NPD)检测时,其检测对象为所有数据类型指针的变量,基于区间运算原理和故障状态机计算检测机制,在数据流计算时,只能根据语句2计算出指针p1为NULL_OR_NOTNULL,故在语句3对其解引用时报错。对于语句4定义的指针p2,由于静态分析中指针模型的描述能力有限,无法对其每一级指针给出其相应描述。根据基本数据类型拆分的定义,将p2的声明拆分成三个独立变量p2、*p2和**p2分别进行独立变量声明,对于语句4则有如下等价:
p2=&p1;//p2:NOTNULL
*p2=p 1;//*p2:NULL_OR_NOTNULL
**p2=*p1;//**p2:UNKOWN
经过上诉类型拆分等价后,NPD检测对象扩展为指针变量和经过指针变量拆分后仍为指针变量的独立变量,如上述程序中的p1、p2和*p2,在区间运算和故障状态机计算检测机制不变的前提下,则可以根据*p2的取值为NULL_OR_NOTNULL检测出语句5中的NPD。
再以下面一段实例代码为例:
1:struct str1{
2:int a,b;
3:int*p};
4:struct str2{
5:int a;
6:struct str1b;}
7:void f(){
8:struct str2s={0,{0,0,(int*)malloc(sizeof(int))}};
9:int a=1/s.a;//IAO false negative
10:int b=1/s.b.a;//IAO false negative
11:int c=*s.b.p;//NPD false negative}
按照结构体的类型定义,在符号表中记录下结构体成员的相关基本数据类型信息,根据成员的类型信息,在语句8处将结构体s进行基本数据类型拆分:根据复杂数据类型变量的基本数据类型拆分定义,将s拆分为s.a、s.b.a、s.b.b和s.b.p,在对s进行初始化的同时,分别将成员变量对应的独立变量声明进行区间运算,更新其相应的区间,为后续故障状态机的检测做准备。
本发明采用复杂数据类型变量的基本数据类型拆分算法的优点在于:可以在不改变原有的故障检测机制的前提下,通过将静态分析中难以描述完备的复杂数据类型拆分成可以分析的独立变量,在数据流计算时实现域敏感分析,由于分析对象仍然为基本数据类型变量,只是在复杂数据类型声明并初始化时做了相应展开,故对代码静态测试中的分析效率不会有太大影响。
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。
Claims (7)
1.一种复杂数据结构在代码静态测试中的处理方法,其特征在于,该方法包括:
在符号表中记录与复杂数据类型相关的基本数据类型信息;
对控制流图的每个节点的复杂数据类型,根据与所述复杂数据类型相关的基本数据类型信息进行基本数据类型拆分,将基本数据类型拆分后得到的每个独立变量进行独立分析,更新相应的控制流图节点信息;
输出更新后的控制流图;
所述复杂数据类型包括:结构体、类、数组和复杂指针,所述记录与复杂数据类型相关的基本数据类型信息,为:
记录与结构体相关的基本数据类型信息,包括:建立结构体类型模型实例,在结构体类型模型实例中,用哈希表Hashtabel<image,Type>记录结构体成员变量的相应类型Type和名称image;用动态数组ArrayList<image>记录结构体成员变量的出现顺序;当结构体成员变量的类型为其他复杂数据类型时,Type值为所述其他复杂数据类型相应的类型模型实例;
记录与类相关的基本数据类型信息,包括:建立类类型模型实例,在类类型模型实例中主要包括:1)用Hashtabel<image,Type>记录成员变量名和成员变量类型信息;2)用Hashtabel<image,Summary>记录成员函数的函数名及其对应的函数摘要Summary,若为虚函数,则不予记录;3)用ArrayList<Type>记录父类类型信息;
记录与数组和复杂指针相关的基本数据类型信息,包括:只记录数组和复杂指针的成员变量的单独声明类型。
2.根据权利要求1所述的处理方法,其特征在于,所述根据与所述复杂数据类型相关的基本数据类型信息进行基本数据类型拆分为:
所述复杂数据类型为结构体时,利用符号表中记录的与结构体相关的基本数据类型信息,逐一遍历结构体成员,在结构体成员类型为基本数据类型时,对所述结构体成员进行独立变量声明;在结构体成员类型为复杂数据类型时,对所述结构体成员递归进行基本数据类型拆分;
所述复杂数据类型为类时,利用符号表中记录的与类相关的基本数据类型信息,逐一遍历类成员,在所述类成员类型为基本数据类型时,对所述类成员进行独立变量声明;在类成员类型为复杂数据类型时,对该类成员类型递归进行基本数据类型拆分;
所述复杂数据类型为数组时,利用符号表中记录的与数组相关的基本数据类型信息,查找所有数组长度确定的数组声明,在所述数组声明的数组类型为基本数据类型时,按照基本数据类型对所述数组进行独立变量声明;在数组类型为复杂数据类型时,对该数组类型递归进行基本数据类型拆分;
所述复杂数据类型为复杂指针时,利用符号表中记录的与复杂指针相关的基本数据类型信息,查找所有复杂指针声明,当复杂指针声明为多级指针时,对不指向结构体的每一级指针做独立变量声明;当复杂指针声明为指向结构体的指针或多级指针的最后一级指针为指向结构体的指针时,对所述指向结构体的指针指向的结构体进行基本数据类型拆分。
3.一种复杂数据结构在代码静态测试中的处理装置,其特征在于,该装置包括:符号表模块、基本数据类型拆分模块、分析更新模块、输出模块;其中,
符号表模块,用于在符号表中记录与复杂数据类型相关的基本数据类型信息;具体用于:记录与结构体相关的基本数据类型信息,包括:建立结构体类型模型实例,在结构体类型模型实例中,用哈希表Hashtabel<image,Type>记录结构体成员变量的相应类型Type和名称image;用动态数组ArrayList<image>记录结构体成员变量的出现顺序;当结构体成员变量的类型为其他复杂数据类型时,Type值为所述其他复杂数据类型相应的类型模型实例;
记录与类相关的基本数据类型信息,包括:建立类类型模型实例,在类类型模型实例中主要包括:1)用Hashtabel<image,Type>记录成员变量名和成员变量类型信息;2)用Hashtabel<image,Summary>记录成员函数的函数名及其对应的函数摘要Summary,若为虚函数,则不予记录;3)用ArrayList<Type>记录父类类型信息;
记录与数组和复杂指针相关的基本数据类型信息,包括:只记录数组和复杂指针的成员变量的单独声明类型;
基本数据类型拆分模块,用于对控制流图的每个节点的复杂数据类型,根据与所述复杂数据类型相关的基本数据类型信息进行基本数据类型拆分,将基本数据类型拆分后得到的每个独立变量通知给分析更新模块;
分析更新模块,用于将基本数据类型拆分后得到的每个独立变量进行独立分析,更新相应的控制流图节点信息;
输出模块,用于输出更新后的控制流图。
4.根据权利要求3所述的处理装置,其特征在于,所述基本数据类型拆分模块,具体用于利用符号表中记录的与结构体相关的基本数据类型信息,逐一遍历结构体成员,在结构体成员类型为基本数据类型时,对所述结构体成员进行独立变量声明;在结构体成员类型为复杂数据类型时,对该结构体成员递归进行基本数据类型拆分。
5.根据权利要求3所述的处理装置,其特征在于,所述基本数据类型拆分模块,具体还用于利用符号表中记录的与类相关的基本数据类型信息,逐一遍历类成员,在所述类成员类型为基本数据类型时,对所述类成员进行独立变量声明;在类成员类型为复杂数据类型时,对该类成员类型递归进行基本数据类型拆分。
6.根据权利要求3所述的处理装置,其特征在于,所述基本数据类型拆分模块,具体还用于利用符号表中记录的与数组相关的基本数据类型信息,查找所有数组长度确定的数组声明,在所述数组声明的数组类型为基本数据类型时,按照基本数据类型对所述数组进行独立变量声明;在数组类型为复杂数据类型时,对该数组类型递归进行基本数据类型拆分。
7.根据权利要求3所述的处理装置,其特征在于,所述基本数据类型拆分模块,具体还用于利用符号表中记录的与复杂指针相关的基本数据类型信息,查找所有复杂指针声明,当复杂指针声明为多级指针时,对不指向结构体的每一级指针做独立变量声明;当复杂指针声明为指向结构体的指针或多级指针的最后一级指针为指向结构体的指针时,对所述指向结构体的指针指向的结构体进行基本数据类型拆分。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210071743.9A CN102662829B (zh) | 2012-03-16 | 2012-03-16 | 一种复杂数据结构在代码静态测试中的处理方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210071743.9A CN102662829B (zh) | 2012-03-16 | 2012-03-16 | 一种复杂数据结构在代码静态测试中的处理方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102662829A CN102662829A (zh) | 2012-09-12 |
CN102662829B true CN102662829B (zh) | 2015-02-18 |
Family
ID=46772326
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210071743.9A Expired - Fee Related CN102662829B (zh) | 2012-03-16 | 2012-03-16 | 一种复杂数据结构在代码静态测试中的处理方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102662829B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103176796A (zh) * | 2013-02-04 | 2013-06-26 | 浙江大学 | 一种在autosar中实现复杂数据到信号组的映射方法 |
CN105760161B (zh) * | 2016-02-04 | 2019-01-08 | 网易(杭州)网络有限公司 | Python的属性解析方法及装置 |
CN108549531A (zh) * | 2018-04-19 | 2018-09-18 | 携程旅游网络技术(上海)有限公司 | 复杂类型数据自动生成方法、装置、电子设备、存储介质 |
CN112100059B (zh) * | 2020-08-20 | 2021-09-14 | 浙江大学 | 一种c语言的指针类型分析方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101286132A (zh) * | 2008-06-02 | 2008-10-15 | 北京邮电大学 | 一种基于软件缺陷模式的测试方法及系统 |
EP2007070A1 (de) * | 2007-06-18 | 2008-12-24 | Avaya GmbH & Co. KG | Verfahren zur Darstellung von Prozessinformationen für eine Datenverarbeitungsanlage sowie Datenverarbeitungssystem |
JP2011013792A (ja) * | 2009-06-30 | 2011-01-20 | Fujitsu Ltd | プログラムモデル検査におけるデータベース制御装置、データベース制御方法、データベース制御プログラム |
CN102023923A (zh) * | 2010-12-28 | 2011-04-20 | 北京邮电大学 | 一种基于别名分析技术的软件测试方法 |
-
2012
- 2012-03-16 CN CN201210071743.9A patent/CN102662829B/zh not_active Expired - Fee Related
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP2007070A1 (de) * | 2007-06-18 | 2008-12-24 | Avaya GmbH & Co. KG | Verfahren zur Darstellung von Prozessinformationen für eine Datenverarbeitungsanlage sowie Datenverarbeitungssystem |
CN101286132A (zh) * | 2008-06-02 | 2008-10-15 | 北京邮电大学 | 一种基于软件缺陷模式的测试方法及系统 |
JP2011013792A (ja) * | 2009-06-30 | 2011-01-20 | Fujitsu Ltd | プログラムモデル検査におけるデータベース制御装置、データベース制御方法、データベース制御プログラム |
CN102023923A (zh) * | 2010-12-28 | 2011-04-20 | 北京邮电大学 | 一种基于别名分析技术的软件测试方法 |
Non-Patent Citations (2)
Title |
---|
《基于缺陷模式的软件测试中的区间运算应用》;杨朝红等;《计算机辅助设计与图形学学报》;20081231;第20卷(第12期);第1630-1635页 * |
C语言指针分析的设计与实现;郭曦;《鄂州大学学报》;20100331;第17卷(第2期);第10-12页 * |
Also Published As
Publication number | Publication date |
---|---|
CN102662829A (zh) | 2012-09-12 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101739339B (zh) | 一种基于程序动态依赖关系的软件故障定位方法 | |
CN104536883B (zh) | 一种静态缺陷检测方法及其系统 | |
Le Goues et al. | The ManyBugs and IntroClass benchmarks for automated repair of C programs | |
CN105787367B (zh) | 一种软件更新的补丁安全性检测方法及系统 | |
Chen et al. | BHive: A benchmark suite and measurement framework for validating x86-64 basic block performance models | |
JP2017519300A (ja) | ソフトウェアアナリティクスのためのシステム及び方法 | |
Pereira et al. | SPELLing out energy leaks: Aiding developers locate energy inefficient code | |
CN104850411A (zh) | 存储系统基准评测程序生成方法及装置 | |
CN102662825B (zh) | 一种面向堆操作程序的内存泄漏检测方法 | |
CN102662829B (zh) | 一种复杂数据结构在代码静态测试中的处理方法和装置 | |
WO2009156198A1 (en) | Method and system for generating of a control flow graph for representing a program code | |
Santelices et al. | Quantitative program slicing: Separating statements by relevance | |
Kirner et al. | Using measurements as a complement to static worst-case execution time analysis | |
Sýkora et al. | Granite: A graph neural network model for basic block throughput estimation | |
Zhao et al. | Qchecker: Detecting bugs in quantum programs via static analysis | |
CN106021109A (zh) | 一种面向程序结构分析自动化框架模型 | |
Laguna et al. | Pinpointing scale-dependent integer overflow bugs in large-scale parallel applications | |
Izsó et al. | MONDO-SAM: A Framework to Systematically Assess MDE Scalability. | |
Kauhanen et al. | Regression test selection tool for python in continuous integration process | |
Wang et al. | Invariant based fault localization by analyzing error propagation | |
CN113836023A (zh) | 一种基于体系结构交叉检查的编译器安全性测试方法 | |
Nikolaidis et al. | Experience with managing technical debt in scientific software development using the exa2pro framework | |
Wang et al. | Automatic debugging of operator errors based on efficient mutation analysis | |
Panigrahi et al. | Regression test size reduction using improved precision slices | |
CN105589730B (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 | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20150218 Termination date: 20170316 |