CN103559127B - 一种缺陷处理方法及缺陷处理装置 - Google Patents
一种缺陷处理方法及缺陷处理装置 Download PDFInfo
- Publication number
- CN103559127B CN103559127B CN201310516392.2A CN201310516392A CN103559127B CN 103559127 B CN103559127 B CN 103559127B CN 201310516392 A CN201310516392 A CN 201310516392A CN 103559127 B CN103559127 B CN 103559127B
- Authority
- CN
- China
- Prior art keywords
- defect
- expression
- formula
- subtab
- expression formula
- 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
- 230000007547 defect Effects 0.000 title claims abstract description 202
- 238000000034 method Methods 0.000 title claims abstract description 28
- 238000012545 processing Methods 0.000 title claims description 19
- 238000012360 testing method Methods 0.000 claims abstract description 53
- 238000005206 flow analysis Methods 0.000 claims abstract description 28
- 238000006243 chemical reaction Methods 0.000 claims abstract description 19
- 230000002950 deficient Effects 0.000 claims abstract description 19
- 238000012795 verification Methods 0.000 claims abstract description 11
- 230000003068 static effect Effects 0.000 claims description 13
- 238000004458 analytical method Methods 0.000 claims description 11
- 230000005540 biological transmission Effects 0.000 claims description 7
- 238000007689 inspection Methods 0.000 claims description 5
- 238000011156 evaluation Methods 0.000 claims description 4
- 230000007704 transition Effects 0.000 claims description 4
- 238000001514 detection method Methods 0.000 abstract description 6
- 230000001419 dependent effect Effects 0.000 abstract description 3
- 230000000875 corresponding effect Effects 0.000 description 7
- 238000010586 diagram Methods 0.000 description 5
- 238000005516 engineering process Methods 0.000 description 5
- 239000000203 mixture Substances 0.000 description 5
- 230000006870 function Effects 0.000 description 3
- 230000001276 controlling effect Effects 0.000 description 2
- 238000003672 processing method Methods 0.000 description 2
- 230000006399 behavior Effects 0.000 description 1
- 230000002596 correlated effect Effects 0.000 description 1
- 230000007812 deficiency Effects 0.000 description 1
Landscapes
- Stored Programmes (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种缺陷处理方法,包括:通过SDDL‑EXP,生成语法类缺陷模式;其中,所述SDDL‑EXP为预定的值相关缺陷模式语言;根据所述语法类缺陷模式,在被测代码中查找检测点,并将所述语法类缺陷模式中的缺陷发生的条件实例化;根据预设的规范化策略,将所述被测代码中的变量及表达式进行转换;对转换后的被测代码进行后向的数据流分析,根据实例化的条件验证在所述检测点处是否有缺陷发生。本发明还同时公开了一种缺陷处理器。采用本发明的技术方案,能够便捷地扩充与用户相关的缺陷模式,并且通过该缺陷模式进行有效的缺陷检测,提升了用户的体验。
Description
技术领域
本发明涉及静态测试技术,尤其涉及一种缺陷处理方法及缺陷处理装置。
背景技术
静态代码缺陷分析技术通过对代码进行静态分析来推测程序运行时的表现行为,从而发现代码中可能存在的缺陷。这类技术主要包括抽象解释、定理证明、模型检测、符号执行和基于缺陷模式的代码检查等。
基于缺陷模式的代码检查主要包括以下步骤:首先,对已有代码中出现过的缺陷进行总结并提炼出“缺陷模式知识”;然后,采用静态分析的方法对待检测的代码进行缺陷模式匹配以确定待检测的代码是否包含“缺陷模式知识”中的缺陷,并把匹配结果以缺陷检测报告的形式呈现给用户。采用上述方法的典型缺陷静态分析工具为FindBugs、PMD、Hammurapi等。
然而,对于现有的基于缺陷模式的代码检查的缺陷静态分析工具,用户往往希望能够扩充“缺陷模式知识”,以使工具能够支持对自己所关注的“代码缺陷”进行检测。但大多数缺陷静态分析工具并没有为用户提供“添加新缺陷模式”的功能,或者,部分缺陷静态分析工具虽然支持用户扩充缺陷模式知识,但其扩展方式在易用性方面还存在很大不足。
发明内容
有鉴于此,本发明的主要目的在于提供一种缺陷处理方法及缺陷处理装置,能够便捷地扩充与用户相关的缺陷模式,并且通过该缺陷模式进行有效的缺陷检测,提升了用户的体验。
为达到上述目的,本发明的技术方案是这样实现的:
一种缺陷处理方法,所述方法包括:
通过表达式值静态默认描述语言SDDL-EXP生成语法类缺陷模式;其中,所述SDDL-EXP为预定的值相关缺陷模式语言;
根据所述语法类缺陷模式,在被测代码中查找检测点,并将所述语法类缺陷模式中的缺陷发生的条件实例化;
根据预设的规范化策略,将所述被测代码中的变量及表达式进行转换;
对转换后的被测代码进行后向的数据流分析,根据实例化的条件验证在所述检测点处是否有缺陷发生。
所述通过SDDL-EXP,生成语法类缺陷模式,包括:
基于可扩展标记语言XML生成根标签<Default>,以及所述根标签<Default>的一级子标签:<Pattern>、<Operand>以及<Condition>,以及所述一级子标签<Operand>的二级子标签:<Order>和<Symbol>;
在所述一级子标签<Pattern>中,以伪代码形式生成缺陷模式相关表达式;
在所述二级子标签<Order>中,生成待检测的变量在所述缺陷模式相关表达式中的位置;
在所述二级子标签<Symbol>中,为所述待检测变量生成标识符;
在所述一级子标签<Condition>中,以所述标识符形式生成所述待检测变量发生缺陷的条件。
所述方法还包括:基于XML生成根标签<Default>、以及所述根标签<Default>的一级子标签:<Pattern>、<Operand>以及<Condition>时,还生成所述根标签<Default>的一级子标签:<Description>、以及所述一级标签<Description>的二级子标签:<Name>、<Date>、<Language>以及<Example>;
在所述二级子标签<Name>中,生成缺陷模式的名称;
在所述二级子标签<Date>中,生成缺陷模式的创建时间;
在所述二级子标签<Language>中,生成被检测代码的语言类型;
在所述二级子标签<Example>中,生成示例代码。
所述根据所述语法类缺陷模式,在被测代码中查找检测点,并将所述语法类缺陷模式中的缺陷发生的条件实例化,包括:
解析所述一级子标签<Pattern>中的伪代码,确定出缺陷模式相关表达式的类型;
在所述被测代码中查找与所述缺陷模式相关表达式的类型相匹配的表达式,并作为检测点;
依据所述二级子标签<Order>,在所匹配的表达式中提取待检测的变量;
将所述一级子标签<Condition>中的所述待检测变量发生缺陷的条件中的标识符替换为所提取的待检测的变量。
所述根据预设的规范化策略,将所述被测代码中的变量及表达式进行转换,包括:
以表达式的形式生成规范化策略,所述规范化策略包括:Constant类型规范化表达式、Primitive Address类型规范化表达式、Allocitive Address类型规范化表达式、Dereference Expression类型规范化表达式以及Offset Expression类型规范化表达式;其中,Constant类型规范化表达式用于表示常量;Primitive Address类型规范化表达式用于表示变量所代表的内存单元的地址;Allocitive Address类型规范化表达式用于表示语句动态分配的内存单元的地址;Dereference Expression类型规范化表达式用于表示堆或栈上的内存单元;Offset Expression类型规范化表达式用于表示通过基地址和地址偏移量得到的内存单元;
根据所述规范化策略,将所述被测代码中的变量及表达式转换为所述规范化策略对应的规范化表达式。
所述对转换后的被测代码进行后向的数据流分析,根据实例化的条件验证在所述检测点处是否有缺陷发生,包括:
以所述检测点为起点,沿控制流图CFG进行后向的数据流分析,以验证所述检测点处缺陷发生的条件是否成立;
其中,数据流分析的数据流值为<e,formula>二元组,所述e为被测代码中规范化后的表达式,所述formula为约束条件。
所述沿CFG进行后向的数据流分析,包括:
针对CFG中的每个节点,合并后继节点传递来的数据流值;
更新合并后的数据流值并化简更新后的数据流值;
当化简后的数据流值中的formula的值为true时,确定为所述检测点处有缺陷发生;当化简后的数据流值中的formula的值为false时,确定为所述检测点处没有缺陷发生;
当化简后的数据流值中的formula的值为除true和false以外的值时,将化简后的数据流值传递给前驱节点。
一种缺陷处理装置,所述缺陷处理装置包括:
生成单元,用于通过SDDL-EXP,生成语法类缺陷模式;其中,所述SDDL-EXP为预定的值相关缺陷模式语言;
检测单元,用于根据所述语法类缺陷模式,在被测代码中查找检测点,并将所述语法类缺陷模式中的缺陷发生的条件实例化;
规范单元,用于根据预设的规范化策略,将所述被测代码中的变量及表达式进行转换;
验证单元,用于对转换后的被测代码进行后向的数据流分析,根据实例化的条件验证在所述检测点处是否有缺陷发生。
所述生成单元,还用于基于XML生成根标签<Default>、以及所述根标签<Default>的一级子标签:<Pattern>、<Operand>以及<Condition>、以及所述一级子标签<Operand>的二级子标签:<Order>和<Symbol>;
在所述一级子标签<Pattern>中,以伪代码形式生成缺陷模式相关表达式;
在所述二级子标签<Order>中,生成待检测的变量在所述缺陷模式相关表达式中的位置;
在所述二级子标签<Symbol>中,为所述待检测变量生成标识符;
在所述一级子标签<Condition>中,以所述标识符形式生成所述待检测变量发生缺陷的条件。
所述生成单元,还用于在基于XML生成根标签<Default>、以及所述根标签<Default>的一级子标签:<Pattern>、<Operand>以及<Condition>时,还生成所述根标签<Default>的一级子标签:<Description>、以及所述一级标签<Description>的二级子标签:<Name>、<Date>、<Language>以及<Example>;
在所述二级子标签<Name>中,生成缺陷模式的名称;
在所述二级子标签<Date>中,生成缺陷模式的创建时间;
在所述二级子标签<Language>中,生成被检测代码的语言类型;
在所述二级子标签<Example>中,生成示例代码。
所述检测单元包括:
解析子单元,用于解析所述一级子标签<Pattern>中的伪代码,确定出缺陷模式相关表达式的类型;
查找子单元,用于在所述被测代码中查找与所述缺陷模式相关表达式的类型相匹配的表达式,并作为检测点;
提取子单元,用于依据所述二级子标签<Order>,在所匹配的表达式中提取待检测的变量;
替换子单元,用于将所述一级子标签<Condition>中的所述待检测变量发生缺陷的条件中的标识符替换为所提取的待检测的变量。
所述规范单元包括:
规范策略子单元,用于以表达式的形式生成规范化策略,所述规范化策略包括:Constant类型规范化表达式、Primitive Address类型规范化表达式、Allocitive Address类型规范化表达式、Dereference Expression类型规范化表达式以及Offset Expression类型规范化表达式;其中,Constant类型规范化表达式用于表示常量;Primitive Address类型规范化表达式用于表示变量所代表的内存单元的地址;Allocitive Address类型规范化表达式用于表示语句动态分配的内存单元的地址;Dereference Expression类型规范化表达式用于表示堆或栈上的内存单元;Offset Expression类型规范化表达式用于表示通过基地址和地址偏移量得到的内存单元;
转换子单元,用于根据所述规范化策略,将所述被测代码中的变量及表达式转换为所述规范化策略对应的规范化表达式。
所述验证单元,还用于以所述检测点为起点,沿CFG进行后向的数据流分析,以验证所述检测点处缺陷发生的条件是否成立;
其中,数据流分析的数据流值为<e,formula>二元组,所述e为被测代码中规范化后的表达式,所述formula为约束条件。
所述验证单元包括:
合并子单元,用于针对CFG中的每个节点,合并后继节点传递来的数据流值;
更新子单元,用于更新合并后的数据流值;
化简子单元,用于化简更新后的数据流值;
第一确定子单元,用于当化简后的数据流值中的formula的值为true时,确定为所述检测点处有缺陷发生;当化简后的数据流值中的formula的值为false时,确定为所述检测点处没有缺陷发生;
第二确定子单元,用于当化简后的数据流值中的formula的值为除true和false以外的值时,将化简后的数据流值传递给前驱节点。
本发明实施例中,通过表达式值静态默认描述语言(SDDL-EXP,Static DefaultDescription Language for Expression Value),生成语法类缺陷模式;其中,所述SDDL-EXP为预定的值相关缺陷模式语言;根据所述语法类缺陷模式,在被测代码中查找检测点,并将所述语法类缺陷模式中的缺陷发生的条件实例化;根据预设的规范化策略,将所述被测代码中的变量及表达式进行转换;对转换后的被测代码进行后向的数据流分析,根据实例化的条件验证在所述检测点处是否有缺陷发生。如此,便捷地扩充了与用户相关的缺陷模式,并且通过该缺陷模式进行有效的缺陷检测,提升了用户的体验。
附图说明
图1为本发明实施例的缺陷处理方法的流程示意图;
图2为本发明实施例的在被测代码中查找检测点的流程示意图;
图3为本发明实施例的后向数据流分析的流程示意图;
图4为本发明实施例的缺陷处理装置的结构组成示意图;
图5为本发明实施例的检测单元的结构组成示意图;
图6为本发明实施例的规范单元的结构组成示意图;
图7为本发明实施例的验证单元的结构组成示意图。
具体实施方式
为了能够更加详尽地了解本发明的特点与技术内容,下面结合附图对本发明的实现进行详细阐述,所附附图仅供参考说明之用,并非用来限定本发明。
图1为本发明实施例的缺陷处理方法的流程示意图,如图1所示,在本发明一个优选实施例中,所述缺陷处理方法包括以下步骤,
步骤101:通过SDDL-EXP,生成语法类缺陷模式;其中,所述SDDL-EXP为预定的值相关缺陷模式语言。
本实施例中,使用预定的值相关缺陷模式语言——SDDL-EXP生成语法类缺陷模式。
优选地,所述通过SDDL-EXP,生成语法类缺陷模式,包括:
基于可扩展标记语言(XML,Extensible Markup Language)生成根标签<Default>、以及所述根标签<Default>的一级子标签:<Pattern>、<Operand>以及<Condition>、以及所述一级子标签<Operand>的二级子标签:<Order>和<Symbol>;
在所述一级子标签<Pattern>中,以伪代码形式生成缺陷模式相关表达式;
在所述二级子标签<Order>中,生成待检测的变量在所述缺陷模式相关表达式中的位置;
在所述二级子标签<Symbol>中,为所述待检测变量生成标识符;
在所述一级子标签<Condition>中,以所述标识符形式生成所述待检测变量发生缺陷的条件。
优选地,所述方法还包括:基于XML生成根标签<Default>、以及所述根标签<Default>的一级子标签:<Pattern>、<Operand>以及<Condition>时,还生成所述根标签<Default>的一级子标签:<Description>、以及所述一级标签<Description>的二级子标签:<Name>、<Date>、<Language>以及<Example>;
在所述二级子标签<Name>中,生成缺陷模式的名称;
在所述二级子标签<Date>中,生成缺陷模式的创建时间;
在所述二级子标签<Language>中,生成被检测代码的语言类型;
在所述二级子标签<Example>中,生成示例代码。
基于XML生成的与SDDL-EXP相关的上述各种标签,具有比较好的结构化特征。
步骤102:根据所述语法类缺陷模式,在被测代码中查找检测点,并将所述语法类缺陷模式中的缺陷发生的条件实例化。
这里,所述语法类缺陷模式已经通过SDDL-EXP进行表述。
步骤103:根据预设的规范化策略,将所述被测代码中的变量及表达式进行转换。
优选地,所述根据预设的规范化策略,将所述被测代码中的变量及表达式进行转换,包括:
以表达式的形式生成规范化策略,所述规范化策略包括:Constant类型规范化表达式、Primitive Address类型规范化表达式、Allocitive Address类型规范化表达式、Dereference Expression类型规范化表达式以及Offset Expression类型规范化表达式;其中,Constant类型规范化表达式用于表示常量;Primitive Address类型规范化表达式用于表示变量所代表的内存单元的地址;Allocitive Address类型规范化表达式用于表示语句动态分配的内存单元的地址;Dereference Expression类型规范化表达式用于表示堆或栈上的内存单元;Offset Expression类型规范化表达式用于表示通过基地址和地址偏移量得到的内存单元;
根据所述规范化策略,将所述被测代码中的变量及表达式转换为所述规范化策略对应的规范化表达式。
本实施例中,Dereference Expression类型规范化表达式以及OffsetExpression类型规范化表达式也可以统称为Expression类型规范化表达式;上述几种类型规范化表达式可以通过表述为:
例如,设x是被测代码中的任意变量,则被测代码中形如“&x”的表达式,会转换成规范化表达式中的“ax”;表达式“x”,会转化为规范化表达式中的“*ax”;表达式“*x”,会转化为规范化表达式中的“**ax”;表达式“x.f”,会转化为规范化表达式中的“*(ax#f)”;表达式“x->f”,会转化为规范化表达式中的“*((*ax)#f)”。
具体地,Constant类型规范化表达式用于表示常量,例如数值常量和字符常量等;
Primitive Address类型规范化表达式用于表示变量所代表的内存单元的地址,每一个变量都对应一个Primitive Address类型的规范化表达式;
Allocitive Address类型规范化表达式用于表示语句动态分配的内存单元的地址,例如malloc、new等语句动态分配的内存单元的地址,每一个动态分配的内存单元都对应着一个Allocative Address类型的表达式;
Dereference Expression类型规范化表达式用于表示堆或栈上的内存单元;Dereference Expression类型的规范化表达式是形如“*e”的表达式,每一个DereferenceExpression类型的规范化表达式都对应着堆或栈上的一个内存单元,其取值就是该内存单元中保存的值,而其子表达式e的取值就是该内存单元的地址;
Offset Expression类型规范化表达式用于表示通过基地址和地址偏移量得到的内存单元;Offset Expression类型的规范化表达式是形如“e#f”的表达式,每一个OffsetExpression类型的规范化表达式都对应着一个以e的取值为基地址、地址偏移量f得到的内存单元。
本实施例中,将被测代码中的变量及表达式规范化后,后续步骤104的分析可以操作被测代码中的各种左值表达式所对应的内存单元的地址,从而在有别名(Alias)存在的情况下,进行强更新(Strong update)。
步骤104:对转换后的被测代码进行后向的数据流分析,根据实例化的条件验证在所述检测点处是否有缺陷发生。
下面结合图2对上述步骤102中的根据所述语法类缺陷模式,在被测代码中查找检测点,并将所述语法类缺陷模式中的缺陷发生的条件实例化,进行详细说明,如图2所示,所述根据所述语法类缺陷模式,在被测代码中查找检测点,并将所述语法类缺陷模式中的缺陷发生的条件实例化,具体包括以下步骤,
步骤1021:解析所述一级子标签<Pattern>中的伪代码,确定出缺陷模式相关表达式的类型。
这里,可以通过语法分析器来解析所述一级子标签<Pattern>中的伪代码,以确定出缺陷模式相关表达式的类型。
步骤1022:在所述被测代码中查找与所述缺陷模式相关表达式的类型相匹配的表达式,并作为检测点。
步骤1023:依据所述二级子标签<Order>,在所匹配的表达式中提取待检测的变量。
步骤1024:将所述一级子标签<Condition>中的所述待检测变量发生缺陷的条件中的标识符替换为所提取的待检测的变量。
下面结合图3对上述步骤104中的对转换后的被测代码进行后向的数据流分析,根据实例化的条件验证在所述检测点处是否有缺陷发生,进行详细说明,所述对转换后的被测代码进行后向的数据流分析,根据实例化的条件验证在所述检测点处是否有缺陷发生,具体包括:以所述检测点为起点,沿控制流图(CFG,Control Flow Graph)进行后向的数据流分析,以验证所述检测点处缺陷发生的条件是否成立;其中,数据流分析的数据流值为<e,formula>二元组,所述e为被测代码中规范化后的表达式,所述formula为约束条件。如图4所示,所述沿CFG进行后向的数据流分析,具体包括以下步骤,
步骤1041:针对CFG中的每个节点,合并后继节点传递来的数据流值。
优选地,所述合并后继节点传递来的数据流值,包括:
若数据流值1为<e1,formula1>,数据流值2为<e2,formula2>,则当e1等于e2时,将数据流值1与数据流值2合并为<e1,formula1∨formula2>;当e1不等于e2时,数据流值1与数据流值2不合并;其中,∨为逻辑并。
步骤1042:更新合并后的数据流值。
优选地,所述更新合并后的数据流值包括:
若e1和e2是Dereference Expression类型规范化表达式或者Offset Expression类型规范化表达式,则当*e1=*e2时,更新数据流值中的<e,formula>;
若CFG中的节点存在路径分支条件时,将数据流值中的formula更新为formula∧路径分支条件,其中,∧为逻辑与。
优选地,上述若e1和e2是Dereference Expression类型规范化表达式或者OffsetExpression类型规范化表达式,则当*e1=*e2时,更新数据流值中的<e,formula>,具体包括:
假设当前的数据流值为<*ew,formula>;
若*e1与*ew语法匹配,则将数据流值的witness域由*ew更新为*e1,同时将formula中的所有*ew都替换成*e1;
若*e1与*ew语法不匹配,则判断*e1与*ew之间是否存在别名关系,是时,则生成两个新的数据流值;其中一个数据流值是将数据流值的witness域由*ew更新为*e1,同时将formula中出现的所有*ew都替换成*e1,并将替换后的formula与“e1==ew”通过逻辑与“∧”组合在一起得到新的formula;另一个数据流值是保持数据流的witness域*e不变,同时将原始的formula与“e1!=ew”通过逻辑与“∧”组合在一起得到新的formula。
步骤1043:化简更新后的数据流值。
本步骤具体包括:依据预设的规则来化简数据流值的formula域。这些规则包括:
其中,a1和a2是规范化表示形式中的Primitive Address类型规范化表达式;t1和t2是Allocative Address类型规范化表达式;c1和c2是Constant类型规范化表达式;e1和e2是Expression类型规范化表达式。
这里,规则(1)的含义是语法上匹配的两个表达式必然相等;
规则(2)至(4)的含义是不管是变量对应的内存单元的地址,还是动态分配的内存单元的地址,彼此之间互不相等;
规则(5)的含义是变量对应的内存单元的地址必不等于NULL;
规则(6)的含义是由于动态内存分配可能会失败,为了能够处理这种情况,认为动态分配的内存单元的地址为NULL成立;
规则(7)的含义是对于两个或多个Offset Expression类型规范化表达式来说,只要偏移量不相同,它们就可能相等;
规则(8)至(10)的含义是在合取式中,形如“e1==e2”的逻辑表达式等效视为赋值表达式“e1=e2”,进而用e2来代替合取式中出现的所有e1,从而实现化简。
步骤1044:化简后的数据流值中的formula的值是否为ture,是时,执行步骤1045;否时,执行步骤1046。
步骤1045:确定为所述检测点处有缺陷发生,结束本流程。
步骤1046:化简后的数据流值中的formula的值是否为false,是时,执行步骤1047;否时,执行步骤1048。
步骤1047:确定为所述检测点处没有缺陷发生,结束本流程。
步骤1048:将化简后的数据流值传递给前驱节点。
本实施例中的数据流值的formula,依照如下的规则构成:
其中,e为规范化表达式中的任意Expression类型的表达式。
下面结合具体代码实施例对本发明实施例中的上述缺陷处理方法做进一步详细的说明。
空指针解引用(NPD,Null Pointer Dereference)缺陷是代码中常见的一种值相关的缺陷。其涉及代码中的各种指针解引用表达式,如“*p”。当被解引用的指针变量p的值为NULL时,NPD缺陷就会发生。
如下所示,使用本发明实施例中的SDDL-EXP可以将NPD缺陷模式描述为:
本实施例中,描述NPD缺陷模式的SDDL-EXP是基于XML的。其根标签是<Default>。<Default>包含的一级子标签从不同方面描述NPD缺陷模式。
一级子标签<Description>及其二级子标签描述了缺陷模式的名称——NPD、创建时间——2012-11-08、被测代码的类型——C程序代码,以及用伪代码形式给出了包含NPD缺陷的示例代码。
一级子标签<Pattern>用伪代码形式给出了NPD缺陷模式关注的被测代码中的表达式类型,即形如“*p”的表达式。
一级子标签<Operand>的二级子标签<Order>指明了NPD缺陷模式要考查的是<Pattern>标签中给出的表达式的第一个变量或操作数;并用标识符“p”来命名这个变量,这是通过二级子标签<Symbol>来实现的。
一级子标签<Condition>说明了NPD缺陷发生的条件,即NPD缺陷模式考查的变量的值为NULL,就会发生NPD缺陷。此外,在该缺陷发生的条件中,用前面二级子标签<Symbol>定义的标识符来表示NPD缺陷模式关注的变量。
定义了NPD缺陷模式后,就可以对缺陷进行检测。被检测的代码为:
如前所述,在进行缺陷分析之前,需要先依照SDDL-EXP查找被测代码中的检测点,这些检测点是后续分析的起点,依照前面定义的SDDL-EXP,查找上述给出的被测代码,存在两个可能的缺陷点,分别是第6行处的“*y”和第5行处“*p”,考查的变量分别是“y”和“p”,它们各自对应的缺陷发生的条件是“y==NULL”和“p==NULL”。
根据预设的规范化策略,将所述被测代码中的变量及表达式进行转换,上述的被测代码,会被转化成为如下形式的代码:
对转换后的被测代码进行后向的数据流分析,根据实例化的条件验证在所述检测点处是否有缺陷发生,对于从第6行开始的后向数据流分析,经过本发明实施例中的合并、更新、化简等处理后,在其中各个语句处的数据流值如下所示,对转换后的被测代码进行后向的数据流分析可以验证在被测代码的第6行有NPD缺陷发生。
图4为本发明实施例的缺陷处理装置的结构组成示意图,如图4所示,在本发明一个优选实施例中,所述缺陷处理装置包括:
生成单元41,用于通过SDDL-EXP,生成语法类缺陷模式;其中,所述SDDL-EXP为预定的值相关缺陷模式语言;
检测单元42,用于根据所述语法类缺陷模式,在被测代码中查找检测点,并将所述语法类缺陷模式中的缺陷发生的条件实例化;
规范单元43,用于根据预设的规范化策略,将所述被测代码中的变量及表达式进行转换;
验证单元44,用于对转换后的被测代码进行后向的数据流分析,根据实例化的条件验证在所述检测点处是否有缺陷发生。
优选地,所述生成单元41,还用于基于XML生成根标签<Default>、以及所述根标签<Default>的一级子标签:<Pattern>、<Operand>以及<Condition>、以及所述一级子标签<Operand>的二级子标签:<Order>和<Symbol>;
在所述一级子标签<Pattern>中,以伪代码形式生成缺陷模式相关表达式;
在所述二级子标签<Order>中,生成待检测的变量在所述缺陷模式相关表达式中的位置;
在所述二级子标签<Symbol>中,为所述待检测变量生成标识符;
在所述一级子标签<Condition>中,以所述标识符形式生成所述待检测变量发生缺陷的条件。
优选地,所述生成单元41,还用于在基于XML生成根标签<Default>、以及所述根标签<Default>的一级子标签:<Pattern>、<Operand>以及<Condition>时,还生成所述根标签<Default>的一级子标签:<Description>、以及所述一级标签<Description>的二级子标签:<Name>、<Date>、<Language>以及<Example>;
在所述二级子标签<Name>中,生成缺陷模式的名称;
在所述二级子标签<Date>中,生成缺陷模式的创建时间;
在所述二级子标签<Language>中,生成被检测代码的语言类型;
在所述二级子标签<Example>中,生成示例代码。
优选地,如图5所示,所述检测单元42包括:
解析子单元421,用于解析所述一级子标签<Pattern>中的伪代码,确定出缺陷模式相关表达式的类型;
查找子单元422,用于在所述被测代码中查找与所述缺陷模式相关表达式的类型相匹配的表达式,并作为检测点;
提取子单元423,用于依据所述二级子标签<Order>,在所匹配的表达式中提取待检测的变量;
替换子单元424,用于将所述一级子标签<Condition>中的所述待检测变量发生缺陷的条件中的标识符替换为所提取的待检测的变量。
优选地,如图6所示,所述规范单元43包括:
规范策略子单元431,用于以表达式的形式生成规范化策略,所述规范化策略包括:Constant类型规范化表达式、Primitive Address类型规范化表达式、AllocitiveAddress类型规范化表达式、Dereference Expression类型规范化表达式以及OffsetExpression类型规范化表达式;其中,Constant类型规范化表达式用于表示常量;Primitive Address类型规范化表达式用于表示变量所代表的内存单元的地址;Allocitive Address类型规范化表达式用于表示语句动态分配的内存单元的地址;Dereference Expression类型规范化表达式用于表示堆或栈上的内存单元;OffsetExpression类型规范化表达式用于表示通过基地址和地址偏移量得到的内存单元;
转换子单元432,用于根据所述规范化策略,将所述被测代码中的变量及表达式转换为所述规范化策略对应的规范化表达式。
优选地,所述验证单元44,还用于以所述检测点为起点,沿CFG进行后向的数据流分析,以验证所述检测点处缺陷发生的条件是否成立;
其中,数据流分析的数据流值为<e,formula>二元组,所述e为被测代码中规范化后的表达式,所述formula为约束条件。
优选地,如图7所示,所述验证单元44包括:
合并子单元441,用于针对CFG中的每个节点,合并后继节点传递来的数据流值;
更新子单元442,用于更新合并后的数据流值;
化简子单元443,用于化简更新后的数据流值;
第一确定子单元444,用于当化简后的数据流值中的formula的值为true时,确定为所述检测点处有缺陷发生;当化简后的数据流值中的formula的值为false时,确定为所述检测点处没有缺陷发生;
第二确定子单元445,用于当化简后的数据流值中的formula的值为除true和false以外的值时,将化简后的数据流值传递给前驱节点。
本领域技术人员应当理解,图4所示的缺陷处理装置中的各单元及其子单元的实现功能可参照前述缺陷处理方法的相关描述而理解。图4所示的缺陷处理装置中的各单元及其子单元的功能可通过运行于处理器上的程序而实现,也可通过具体的逻辑电路而实现。
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。
Claims (14)
1.一种缺陷处理方法,其特征在于,所述方法包括:
通过表达式值静态默认描述语言SDDL-EXP生成缺陷模式;其中,所述SDDL-EXP为预定的值相关缺陷模式语言;所述缺陷模式由以下标签组成:根标签<Default>,以及所述根标签<Default>的一级子标签:<Pattern>、<Operand>和<Condition>,以及所述一级子标签<Operand>的二级子标签:<Order>和<Symbol>;
根据所述缺陷模式,在被测代码中查找检测点,并将所述缺陷模式中的缺陷发生的条件实例化;
根据预设的规范化策略,将所述被测代码中的变量及表达式进行转换;
对转换后的被测代码进行后向的数据流分析,根据实例化的条件验证在所述检测点处是否有缺陷发生。
2.根据权利要求1所述的缺陷处理方法,其特征在于,所述通过SDDL-EXP,生成缺陷模式,包括:
基于可扩展标记语言XML生成根标签<Default>,以及所述根标签<Default>的一级子标签:<Pattern>、<Operand>和<Condition>,以及所述一级子标签<Operand>的二级子标签:<Order>和<Symbol>;
在所述一级子标签<Pattern>中,以伪代码形式生成缺陷模式相关表达式;
在所述二级子标签<Order>中,生成待检测的变量在所述缺陷模式相关表达式中的位置;
在所述二级子标签<Symbol>中,为所述待检测变量生成标识符;
在所述一级子标签<Condition>中,以所述标识符形式生成所述待检测变量发生缺陷的条件。
3.根据权利要求2所述的缺陷处理方法,其特征在于,所述方法还包括:基于XML生成根标签<Default>、以及所述根标签<Default>的一级子标签:<Pattern>、<Operand>和<Condition>时,还生成所述根标签<Default>的一级子标签:<Description>、以及所述一级子标签<Description>的二级子标签:<Name>、<Date>、<Language>和<Example>;
在所述二级子标签<Name>中,生成缺陷模式的名称;
在所述二级子标签<Date>中,生成缺陷模式的创建时间;
在所述二级子标签<Language>中,生成被检测代码的语言类型;
在所述二级子标签<Example>中,生成示例代码。
4.根据权利要求3所述的缺陷处理方法,其特征在于,所述根据所述缺陷模式,在被测代码中查找检测点,并将所述缺陷模式中的缺陷发生的条件实例化,包括:
解析所述一级子标签<Pattern>中的伪代码,确定出缺陷模式相关表达式的类型;
在所述被测代码中查找与所述缺陷模式相关表达式的类型相匹配的表达式,并作为检测点;
依据所述二级子标签<Order>,在所匹配的表达式中提取待检测的变量;
将所述一级子标签<Condition>中的所述待检测变量发生缺陷的条件中的标识符替换为所提取的待检测的变量。
5.根据权利要求1至4任一项所述的缺陷处理方法,其特征在于,所述根据预设的规范化策略,将所述被测代码中的变量及表达式进行转换,包括:
以表达式的形式生成规范化策略,所述规范化策略包括:Constant类型规范化表达式、Primitive Address类型规范化表达式、Allocitive Address类型规范化表达式、Dereference Expression类型规范化表达式以及Offset Expression类型规范化表达式;其中,Constant类型规范化表达式用于表示常量;Primitive Address类型规范化表达式用于表示变量所代表的内存单元的地址;Allocitive Address类型规范化表达式用于表示语句动态分配的内存单元的地址;Dereference Expression类型规范化表达式用于表示堆或栈上的内存单元;Offset Expression类型规范化表达式用于表示通过基地址和地址偏移量得到的内存单元;
根据所述规范化策略,将所述被测代码中的变量及表达式转换为所述规范化策略对应的规范化表达式。
6.根据权利要求5所述的缺陷处理方法,其特征在于,所述对转换后的被测代码进行后向的数据流分析,根据实例化的条件验证在所述检测点处是否有缺陷发生,包括:
以所述检测点为起点,沿控制流图CFG进行后向的数据流分析,以验证所述检测点处缺陷发生的条件是否成立;
其中,数据流分析的数据流值为<e,formula>二元组,所述e为被测代码中规范化后的表达式,所述formula为约束条件。
7.根据权利要求6所述的缺陷处理方法,其特征在于,所述沿CFG进行后向的数据流分析,包括:
针对CFG中的每个节点,合并后继节点传递来的数据流值;
更新合并后的数据流值并化简更新后的数据流值;
当化简后的数据流值中的formula的值为true时,确定为所述检测点处有缺陷发生;当化简后的数据流值中的formula的值为false时,确定为所述检测点处没有缺陷发生;
当化简后的数据流值中的formula的值为除true和false以外的值时,将化简后的数据流值传递给前驱节点。
8.一种缺陷处理装置,其特征在于,所述缺陷处理装置包括:
生成单元,用于通过表达式值静态默认描述语言SDDL-EXP,生成缺陷模式;其中,所述SDDL-EXP为预定的值相关缺陷模式语言;所述缺陷模式由以下标签组成:根标签<Default>,以及所述根标签<Default>的一级子标签:<Pattern>、<Operand>和<Condition>,以及所述一级子标签<Operand>的二级子标签:<Order>和<Symbol>;
检测单元,用于根据所述缺陷模式,在被测代码中查找检测点,并将所述缺陷模式中的缺陷发生的条件实例化;
规范单元,用于根据预设的规范化策略,将所述被测代码中的变量及表达式进行转换;
验证单元,用于对转换后的被测代码进行后向的数据流分析,根据实例化的条件验证在所述检测点处是否有缺陷发生。
9.根据权利要求8所述的缺陷处理装置,其特征在于,所述生成单元,还用于基于XML生成根标签<Default>、以及所述根标签<Default>的一级子标签:<Pattern>、<Operand>和<Condition>、以及所述一级子标签<Operand>的二级子标签:<Order>和<Symbol>;
在所述一级子标签<Pattern>中,以伪代码形式生成缺陷模式相关表达式;
在所述二级子标签<Order>中,生成待检测的变量在所述缺陷模式相关表达式中的位置;
在所述二级子标签<Symbol>中,为所述待检测变量生成标识符;
在所述一级子标签<Condition>中,以所述标识符形式生成所述待检测变量发生缺陷的条件。
10.根据权利要求9所述的缺陷处理装置,其特征在于,所述生成单元,还用于在基于XML生成根标签<Default>、以及所述根标签<Default>的一级子标签:<Pattern>、<Operand>和<Condition>时,还生成所述根标签<Default>的一级子标签:<Description>、以及所述一级子标签<Description>的二级子标签:<Name>、<Date>、<Language>和<Example>;
在所述二级子标签<Name>中,生成缺陷模式的名称;
在所述二级子标签<Date>中,生成缺陷模式的创建时间;
在所述二级子标签<Language>中,生成被检测代码的语言类型;
在所述二级子标签<Example>中,生成示例代码。
11.根据权利要求10所述的缺陷处理装置,其特征在于,所述检测单元包括:
解析子单元,用于解析所述一级子标签<Pattern>中的伪代码,确定出缺陷模式相关表达式的类型;
查找子单元,用于在所述被测代码中查找与所述缺陷模式相关表达式的类型相匹配的表达式,并作为检测点;
提取子单元,用于依据所述二级子标签<Order>,在所匹配的表达式中提取待检测的变量;
替换子单元,用于将所述一级子标签<Condition>中的所述待检测变量发生缺陷的条件中的标识符替换为所提取的待检测的变量。
12.根据权利要求8至11任一项所述的缺陷处理装置,其特征在于,所述规范单元包括:
规范策略子单元,用于以表达式的形式生成规范化策略,所述规范化策略包括:Constant类型规范化表达式、Primitive Address类型规范化表达式、Allocitive Address类型规范化表达式、Dereference Expression类型规范化表达式以及Offset Expression类型规范化表达式;其中,Constant类型规范化表达式用于表示常量;Primitive Address类型规范化表达式用于表示变量所代表的内存单元的地址;Allocitive Address类型规范化表达式用于表示语句动态分配的内存单元的地址;Dereference Expression类型规范化表达式用于表示堆或栈上的内存单元;Offset Expression类型规范化表达式用于表示通过基地址和地址偏移量得到的内存单元;
转换子单元,用于根据所述规范化策略,将所述被测代码中的变量及表达式转换为所述规范化策略对应的规范化表达式。
13.根据权利要求12所述的缺陷处理装置,其特征在于,所述验证单元,还用于以所述检测点为起点,沿控制流图CFG进行后向的数据流分析,以验证所述检测点处缺陷发生的条件是否成立;
其中,数据流分析的数据流值为<e,formula>二元组,所述e为被测代码中规范化后的表达式,所述formula为约束条件。
14.根据权利要求13所述的缺陷处理装置,其特征在于,所述验证单元包括:
合并子单元,用于针对CFG中的每个节点,合并后继节点传递来的数据流值;
更新子单元,用于更新合并后的数据流值;
化简子单元,用于化简更新后的数据流值;
第一确定子单元,用于当化简后的数据流值中的formula的值为true时,确定为所述检测点处有缺陷发生;当化简后的数据流值中的formula的值为false时,确定为所述检测点处没有缺陷发生;
第二确定子单元,用于当化简后的数据流值中的formula的值为除true和false以外的值时,将化简后的数据流值传递给前驱节点。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310516392.2A CN103559127B (zh) | 2013-10-28 | 2013-10-28 | 一种缺陷处理方法及缺陷处理装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310516392.2A CN103559127B (zh) | 2013-10-28 | 2013-10-28 | 一种缺陷处理方法及缺陷处理装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103559127A CN103559127A (zh) | 2014-02-05 |
CN103559127B true CN103559127B (zh) | 2017-03-29 |
Family
ID=50013378
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310516392.2A Expired - Fee Related CN103559127B (zh) | 2013-10-28 | 2013-10-28 | 一种缺陷处理方法及缺陷处理装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103559127B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104331371B (zh) * | 2014-11-26 | 2018-01-19 | 国家电网公司 | 一种分布式代码检测方法 |
CN107038110A (zh) * | 2016-02-03 | 2017-08-11 | 北京京东尚科信息技术有限公司 | 白盒测试的方法和系统 |
CN106843947B (zh) * | 2017-01-04 | 2020-01-24 | 腾讯科技(深圳)有限公司 | 代码缺陷的处理方法和装置 |
CN114138282B (zh) * | 2021-11-30 | 2023-03-31 | 四川效率源信息安全技术股份有限公司 | 一种还原iOS类型编码的伪代码的方法及装置 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101710303A (zh) * | 2009-12-01 | 2010-05-19 | 中国人民解放军国防科学技术大学 | 基于流敏感上下文敏感指向图的内存泄漏检测方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2006031363A (ja) * | 2004-07-15 | 2006-02-02 | Mitsubishi Research Institute Inc | バッファオーバーフロー脆弱性検出プログラム及びバッファオーバーフロー脆弱性検出方法 |
-
2013
- 2013-10-28 CN CN201310516392.2A patent/CN103559127B/zh not_active Expired - Fee Related
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101710303A (zh) * | 2009-12-01 | 2010-05-19 | 中国人民解放军国防科学技术大学 | 基于流敏感上下文敏感指向图的内存泄漏检测方法 |
Non-Patent Citations (2)
Title |
---|
基于域敏感指向分析的区间运算在软件测试中的应用;周虹伯等;《计算机研究与发展》;20121231;第49卷(第9期);第1852-1860页 * |
提高路径敏感缺陷检测方法的效率及精度研究;赵云山等;《计算机学报》;20110630;第34卷(第6期);第1100-1111页 * |
Also Published As
Publication number | Publication date |
---|---|
CN103559127A (zh) | 2014-02-05 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102521121B (zh) | 一种页面测试方法和页面测试装置 | |
Kagdi et al. | Blending conceptual and evolutionary couplings to support change impact analysis in source code | |
US9471875B2 (en) | Using ontologies to comprehend regular expressions | |
CN102792298B (zh) | 使用特征化匹配的规则来匹配元数据源 | |
CN103559127B (zh) | 一种缺陷处理方法及缺陷处理装置 | |
US9164742B2 (en) | Method and a system for searching for parts of a computer program which affects a given symbol | |
CN106371997B (zh) | 一种代码检查方法及装置 | |
CN101571828A (zh) | 基于约束分析和模型检验的代码安全漏洞检测方法 | |
CN104320312B (zh) | 网络应用安全测试工具及模糊测试用例生成方法和系统 | |
CN109033843A (zh) | 用于分布式静态检测系统的Java文件依赖性分析方法及模块 | |
CN106814998B (zh) | 表单序列化方法及装置 | |
CN102662825B (zh) | 一种面向堆操作程序的内存泄漏检测方法 | |
JP2020126641A (ja) | Apiマッシュアップ探査及びリコメンデーション | |
CN102141959B (zh) | 一种受上下文无关文法约束的测试用例生成方法 | |
CN105975584A (zh) | 一种数学表达式相似距离测量方法 | |
WO2019134297A1 (zh) | 配置对命名重复的检测方法、装置、存储介质和智能设备 | |
US20190004927A1 (en) | Accessing application runtime data using a query language | |
CN102968431A (zh) | 一种基于依存树的中文实体关系挖掘的控制装置 | |
Van Den Brink et al. | Quality assessment for embedded SQL | |
CN105930267B (zh) | 一种基于数据库字典的存储过程静态检测方法及系统 | |
He et al. | Knocking the door to the deep web: Integrating web query interfaces | |
CN102681932A (zh) | 一种检测软件异常输入处理正确性的方法 | |
CN104298657A (zh) | 基于表达式的评价指标解析系统 | |
CN103559296A (zh) | 一种基于xml的scpi命令解析方法 | |
Carvalho et al. | DMOSS: Open source software documentation assessment |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20170329 |