应用程序切片技术的静态缺陷检测方法

文档序号:6341411阅读:181来源:国知局
专利名称:应用程序切片技术的静态缺陷检测方法
技术领域
本发明涉及软件测试技术,尤其涉及一种应用程序切片技术的静态缺陷检测方 法,属于路径敏感方法在静态缺陷检测中的应用。
背景技术
软件测试是提高软件质量的重要手段,根据是否运行被测试程序,软件测试可以 分为动态测试和静态测试。基于软件缺陷的静态分析方法可以针对小概率缺陷实施有效 测试,受到了学术界和工业界的广泛关注。静态分析的效率是影响其能否应用于大型软件 缺陷检测的关键,它与分析过程中的计算复杂度密切相关。由于静态分析需要抽象出完整 的程序语义信息,该抽象语义信息往往是精确程序语义的“保守”近似,从而导致其计算量 要远大于程序精确语义所表示的计算量,因此减少保守性分析时的计算量可以提高分析效 率。根据Rice定理,静态分析针对程序的任何非平凡属性(例如是否存在运行时错误), 不可能做到既是可靠的(sound)又是完备的(complete),导致其计算结果可能会出现误报 (false positive)和漏报(false negative)。大量的误报会使人对分析工具失去信心,而 漏报会造成程序具有较高质量的假象,因此提高精度是完善静态分析功能的又一挑战。路径敏感的缺陷检测方法从控制流图头节点依次进行状态迭代,每个缺陷状态都 会关联当前控制流节点的所有数据流信息,在缺陷状态迭代计算时,与缺陷无关的数据流 信息会在控制流上进行传递和计算,这种无关计算势必降低缺陷检测的效率。通过增加控 制流节点构造新的路径,或重构控制流图以消除不可达路径的方法,也可实现路径敏感分 析,但这是一种典型的以效率换精度的方法,限制了其在大型软件缺陷检测中的应用。

发明内容
有鉴于此,本发明的主要目的在于提供一种应用程序切片技术的静态缺陷检测方 法,以提高路径敏感缺陷检测方法的效率及精度,在检测代码量较大程序时可以进一步减 少分析时间并减少误报。为达到上述目的,本发明的技术方案是这样实现的应用程序切片技术的静态缺陷检测方法,该方法包括A、获取待检测缺陷模式的缺陷特征;B、根据所述的缺陷特征,计算分支节点的路径条件,并生成切片准则;C、根据所述的切片准则,遍历控制流图进行程序切片,对控制流图进行重构,得到 已重构的控制流图;D、利用所述的已重构的控制流图,应用缺陷状态迭代算法,进行缺陷模式状态机 计算;E、若当前控制流图节点为非汇合节点,则将所有缺陷状态中的状态条件进行汇聚 及更新操作;F、如果当前控制流图节点为汇合节点,则按照当前缺陷状态的状态条件进行状态合并O其中,所述步骤A中的根据待检测缺陷模式获取其缺陷特征的过程具体为Al、根据缺陷模式状态机FSM的创建条件,检测程序中是否有缺陷模式关联的变 量,该缺陷相关变量即为缺陷特征DefectFeature,记为Df(FSM)。其中,所述步骤B中,根据步骤A计算得到的缺陷特征,遍历控制流图中的所有分 支节点n,根据分支语句块Stmt (η)中是否包含缺陷特征,来确定η是否为路径条件,记为 Pc (η),该步骤B进一步包括;Bi、按节点序遍历控制流图,查询所有出度大于2的节点,将其加入分支语句集合 BranchList,其中可能包含if-else、switch条件分支语句,以及while、do-while、for等 循环语句;B2、将Bl得到的BranchList倒置,然后依次遍历其中的每个分支节点 SplitNode,查询其所包含的语句块Stmt(SplitNode)是否包含缺陷特征Df(FSM);如果不 包含则执行步骤B3,否则执行步骤B4 ;B3、当前分支语句块不包含缺陷特征信息,设置其路径条件IsPc = false,使其在 后续的程序切片时可以根据此路径条件标志快速切片掉;B4、当前分支语句块内包含缺陷特征信息,因此将当前分支的条件变量加入路径 条件集合PCSet,同时设置IsPcO = true ;如果BranchList遍历完毕,则将缺陷特征Df (FSM)与路径条件集合PCSet合并, 从而得到切片准则SCSet。其中,步骤C中根据步骤A和步骤B得到的缺陷特征及路径条件,生成切片准则, 然后根据每个控制流节点的数据流信息进行程序切片进一步包括Cl、按节点序遍历控制流图,获取每个控制流节点的关联变量信息RelVarSet ;C2、,通过比较步骤B中的切片准则SCSet与当前节点的RelVarSet的包含关系进 行程序切片,如果二者交集为空则执行步骤C4 ;否则,执行步骤C3 ;C3、当前节点的数据流信息集合RelVarSet中包含与缺陷检测或路径条件有关的 数据流信息,因此不应该被切片掉,继续执行步骤C2 ;C4、当前节点的数据流信息与缺陷检测及路径条件均无关,因此应该被切片掉,即 将被切片掉语句的前驱及后继相连接;切片过程中如果遇到条件分支节点,则通过步骤B 计算得到的路径条件标志IsPcO来决定是否可以对整个条件分支语句块进行快速切片。其中,步骤E中,从控制流图头节点依次进行状态迭代,每个缺陷状态都关联了当 前控制流节点的路径条件,用当前节点每个变量的抽象取值来表示状态条件;如果当前节 点为顺序控制流节点则进一步包括E1、状态条件汇聚将当前控制流节点η的所有前驱节点进行状态条件合并,得到 新的状态条件作为η的初始状态条件;Ε2、状态条件更新根据当前控制流节点η的数据流信息,更新步骤El中计算得到 的初始状态条件,并根据状态迁移条件判断是否会发生状态迁移;如果状态迁移到Error 状态,则上报一个检测点。其中,步骤F中如果遇到控制流汇合节点,则根据状态属性State Attribute与步 骤Cl得到切片准则SCSet的包含关系,决定是否进行状态合并,其进一步包括
5
F1、获取所有前驱节点的缺陷状态,如果不是相同状态,则只进行状态条件合并操 作,否则执行步骤F2;F2、如果前驱节点的缺陷状态相同,进一步检查其状态属性Attr(State)是否包 含于切片准则SCSet,如果是包含关系则不进行状态合并。本发明所提供的应用程序切片技术的静态缺陷检测方法,具有以下优点将本发明的方法应用于软件静态测试中,实现需求驱动的缺陷检测,能够根据不 同的缺陷检测目的计算程序的不同切片,从而缩小了缺陷检测的范围,提高缺陷检测效率。 由于程序切片考虑程序中存在的各种依赖关系(不仅仅是数据依赖和控制依赖),而且任 何一个程序可以与一组程序切片的并集等价,检测每个切片实际就是测试了整个程序,因 此基于缺陷的程序切片方法满足了静态分析方法的保守性。实验证明,应用程序切片技术 后可以有效减少静态缺陷检测的时间开销,同时减少误报。


图1为本发明程序切片技术在缺陷检测中的应用流程示意图;图Ia为用有向图表示的资源泄漏模式示意图;图Ib为用有向图表示的空指针引用模式示意图; 图2为本发明程序切片生成算法流程示意图3为本发明基于缺陷的程序切片算法流程示意图。
具体实施例方式下面结合附图及本发明的实施例对本发明的方法作进一步详细的说明。现有的基于数据流分析的路径敏感检测方法考虑分支间的组合关系,可以记录控 制流图上的不同路径信息,从而有效减少静态分析时的误报。精确的路径敏感分析方法会 记录程序中的所有路径信息,在控制流分支较多或存在循环时会导致路径爆炸,从而无法 进行分析。因此,实用的路径敏感分析方法往往会采用一些折衷策略,有可能导致精度损 失1)不同路径上的数据流信息在控制流汇合处合并;2)数据流在不可达路径上进行传递。例如,采用迭代求精策略,每次迭代分析的结果都会更新状态合并准则,这种可调 整的合并准则会减少由于关键路径合并而带来的精度损失,但迭代求精要进行重复计算, 且有可能面临迭代不终止的情况;或者,采用变量的抽象取值来表示状态条件,在控制流汇 合节点通过合并相同状态中的状态条件来避免路径爆炸,但该方法的状态合并策略没有区分 在哪些汇合节点可以进行安全的状态合并,导致与缺陷相关的路径信息丢失从而引起误报。基于上述对路径敏感缺陷检测方法的分析,可以得到以下结论1)控制流图节点数决定了状态迭代计算的次数;2)状态条件中关联数据流信息的数量决定了沿控制流进行状态迭代时的复杂 度;3)状态合并策略影响路径敏感检测方法的精度。本发明主要关注点是如何优化这三个方面,以提高路径敏感分析方法的效率和精度。借鉴需求驱动程序分析方法的思想,本发明将程序切片技术应用于缺陷检测,提 出一种应用程序切片技术的测试方法,该方法基于缺陷特征和路径条件建立切片准则,根 据控制流节点上的数据流信息与切片准则的包含关系进行程序切片,得到的切片程序在缺 陷检测时不仅切片掉了缺陷无关节点,从而减少了数据流迭代时的计算量,而且与源程序 完全等价从而保证了静态分析的保守性。为了进一步减少误报,提出一种基于切片的缺陷 状态合并策略,根据控制流分支节点的路径条件,对缺陷状态添加状态属性,从而有选择地 对控制流汇合节点进行状态合并,以提高检测精度。根据是否考虑程序语句的执行次序,静态分析可以分为流敏感分析(flow sensitive)和非流敏感分析(flow insensitive)。程序的控制流图(CFG,Control Flow Graph)即是对语句执行次序的抽象,是具有单一的、固定的入口节点和出口节点的有向图。定义1控制流图程序的控制流图可以表示为一个有向图G = (N, E,n0, nf),其 中N代表节点的集合,每个节点Iii e N反映程序中的顺序执行语句CommonStmt、条件判断 (循环)语句SelectionStmt等,与节点Iii关联的程序语句块表示为Stmt(Iii) ;E e NXN 代表有向边的集合,反映程序中语句间的控制流关系,eh和et分别表示有向边e的头节点 和尾节点;Iitl为函数的唯一入口节点,nf为函数的唯一退出节点。静态缺陷检测方法关键是对缺陷模式进行定义和检测,能处理的缺陷模式种类越 多则分析检测能力越强。定义2缺陷模式指程序中经常发生的缺陷(BUG)所呈现出的语法或语义特征。缺陷模式是对程序属性的一种描述,如果违反该属性则造成一个缺陷。例如,申 请的资源在使用完后必须释放,否则造成资源泄漏缺陷(RL,Resource Leak);数组下标的 使用必须在其数组声明大小范围以内,否则会造成数组越界缺陷(00B,0ut Of Boundary); 指针在解引用之前必须确保其指向非空,否则会造成空指针引用缺陷(NPD,Null Pointer Dereference)0状态机是对程序语义的一种常用和易于理解的抽象表示,缺陷模式可以用缺陷模 式状态机来表示。定义3缺陷模式状态机用于描述缺陷模式的有限状态机(FSM,Finite State Machine),包括状态集合D、状态迁移集合Τ、及迁移条件集合Conditions,其中D = {$start,$error} U Dother,T :DXConditions — D。 $start 禾口 $error 分另Ij表示起女台状态禾口 错误状态,Dother表示其他中间状态的集合。缺陷模式状态机可以用有向图直观地表示,例如RL和NPD缺陷模式分别可用状 态机描述如下,所述资源泄漏模式如图Ia所示,和空指针引用模式如图Ib所示的缺陷状态 机)路径敏感的缺陷检测方法,从控制流图头节点依次进行状态迭代,每个状态都关 联当前控制流节点的所有变量取值信息,称之为状态条件(State Condition)。我们用变量 的抽象取值来表示状态条件,在数据流迭代过程中不断更新状态条件,就会导致缺陷状态 发生迁移,一旦发现状态迁移到$err0r就表示程序中存在该类型的缺陷。如下所示的中代码片断(a),对其中存在的RL缺陷进行检测,采用相同状态合并的路径敏感分析方法,其状态迁移序列如表1所示。


L2
L3 Pl P2 L4 L5 L6 L7 L8
(a)
void fun(int i, int j){ f=null; if (dump)
flag=l;
else
flag = 0; if(i>j) i++;//noise codes if(i>10) j++;// noise codes if (dump)
f=open(.,.); if (Aag==I)
close(f); .......// noise codes
LO
L3:
L4
L6
L8
(b)
void fun(irit i, int j){ f=null; if (dump)
flag=l; else
flag = 0; Il noise codes sliced //noise codes sliced if (dump)
f=open(...); if(flag=l) close(f); Il noise codes sliced
表1所述代码片段(a)的缺陷状态迀移序列
if(flag){
f=open();
b=0; a=b;
if(a=0){
close(f);
(C)
语句状态条件(State Condition)备注Ll$5tori:{flnu]l]}初始状态为L2Sstart {f[null],dump[true],flag[ 1,1]}根据真分支中数据流,更新状态条件L3Sitor^ :{f[nulI],dump[false],flag
}根据假分支中数据流,更新状态条件PlS^torf :{f[null],dump[true or false],flag
,i[inf],j [inf]} _ _控制流汇合节点的缺陷状态合并策 略相同状态中的状态条件进行合并P2%start :{f[null],dump[true_or_false],flag
,i[infl,j在状态条件中添加j和j,其区间未知[inf]}L4Sstart :{f[null],dump[true or false]5flag
,i[inf],j [inf]} 一 —L5$o/ e :{f^notnull],dump[true],flag
,i[ini],j[inf]}真分支中的状态条件更新导致Ssiari 迁移到假分支中隐含的缺陷 状 态 Sstart {flnull],dump[false], flag
,i[inf], j [inl]}L6$5to^:{f[null],dump[false],flag
,i[inf],j[inf]} $o/>e :{fInotnull],dump[true],flag
,i[inf],j[inf]}缺陷状态合并策略不同状态不进行 合并L7Serror :{f[null],dump[false],flag[l,l],i[inf],j[inf]} $close :{fynotnull],dump[true],flag[l,1],i[inf],j['mfl}真分支中状态条件更新导致迁 移到 Senior , Sopen 迁移到 Sclose ; 假分支为空语句,不会发牛状态迁移;L8发现状态,迭代终止根据表1中缺陷状态迁移序列,在L7处缺陷状态自动机迁移到$err0r,这是一个 明显的误报。原因在于L3之后的控制流汇合处,将真假分支中两个$start状态进行了合 并,导致flag与dump的关联关系丢失。另外还可以观察到,Pl之后的状态条件中都关联 了 i和j的抽象取值,此类数据流信息对RL缺陷检测的结果不会产生任何影响,只会增加 状态迭代时的计算量。通过对上述示例程序的观察与分析,我们可以得到以下结论1)消除与缺陷检测无关的冗余代码,可以减少控制流图节点数,从而减少状态迭代的次数;2)减少状态条件中与缺陷检测无关的变量,可以降低数据流传递和计算时的复杂 度;3)对控制流汇合节点的缺陷状态合并策略进行优化,可以减少路径合并导致的精 度损失。根据上述三方面需求,我们借鉴需求驱动分析技术的思想,提出了本发明的应用 程序切片技术的静态缺陷测试方法,以提高缺陷检测效率和精度。需求驱动的静态分析技术从程序分析的需求出发,抽取程序语义信息,在进行分 析之前降低程序的复杂度,大幅减少了分析过程中的计算量,不仅可以快速准确地复现程 序缺陷,而且可以对大型程序中某些特定故障进行检测。本发明采用程序切片技术实现了 需求驱动的缺陷检测方法,利用切片程序在进行缺陷检测时与源程序完全等价,同时减少 了计算复杂度,提高了分析效率和精度。本发明中程序切片技术是一种分析和理解程序的技术,通过对源程序中的每个兴 趣点分别计算切片来达到对程序的分析和理解。程序切片的原理和方法由Mark Weiser 于1979年在其博士论文中首次提出,Weiser认为程序切片与人们在调试程序时所做的智 力抽象是相对应的,他定义程序P的切片S是一个可执行的程序,这个切片程序在某个功 能属性上与P完全等效。根据程序分析和理解时不同的兴趣点,可以定义相应的切片准则 (Slicing Criteria),根据不同的切片准则可以“按需”地对源程序进行功能切片。正是基 于这种“简化问题、缩小目标范围”的原则,程序切片技术成为提高静态分析效率的有效途 径之一。根据路径敏感缺陷检测方法的特点,切片准则可以从缺陷特征及路径条件两个角
度获得。定义4缺陷特征(Defect Feature)给定缺陷模式fsm,它可以检测某一程序属性 feature是否违反了程序语法或语义规则,该feature对应的程序变量即为缺陷模式fsm的 缺陷特征,记为Df (fsm)。定义5节点关联变量(Vex Related Variable)对于控制流图G = (N,E,n0,nf), V e7V , BFarc Stmt(n),其中的Var即为节点η的关联变量,记为RelVar (η)。定义6路径条件(Path Condition) =CFG中只有分支及循环节点可以产生新的路 径,因此路径条件只能在klectionStmt语句中产生,定义节点η的路径条件Pc (n) = {va r I var e RelVar (η) Λ η e SelectionStmt},它包含控制流图中条件分支及循环节点关联的所 有变量。缺陷特征可以理解为缺陷检测是否与程序中某个变量相关,例如NPD模式必然与 一个指针变量相关,RL模式必然与一个资源句柄相关;路径条件则是程序中可能会产生新 路径的条件分支语句所关联的变量,例如if-else、switch, while等语句块中关联的条件变量。通过对程序控制流的进一步观察,并非所有的路径条件都影响缺陷检测结果,如 上述的程序片断(a)中PI、P2处的条件分支不会对RL的检测结果产生任何影响,此类路 径条件不应作为切片准则。另外,变量间的别名关系也会影响切片准则的生成。考虑该程 序片断(c),L2处赋值语句为a和b建立了直接别名关系,同时也为a = 0,flag = true数据流值建立了数据依赖关系;由于b并非路径条件,如果将Ll处语句切片掉会导致上述数 据依赖关系丢失,有可能导致数据流迭代的断流。本发明通过提前进行区间运算,避免了赋值语句形成的别名关系对程序切片的影 响。我们釆用数值区间来表示变量的抽象取值,在程序切片前已经通过区间运算获取了 a 的区间信息,即使Ll处切片掉也不会对缺陷检测产生影响。基于上述分析,本发明切片准 则定义如下SCSet = Df (fsm) U {Pc (η》| ^ SelectionStmt Λ Df (fsm) ^ RelVar ( )}。算法1 切片准则生成算法BrmchList 程序中所有的条件分支节点IsPc (η)标志当前条件分支节点η是否为路径条件GetBrmchVexList (η)获取当前条件分支η所在分支的所有语句块SkipBrmchVexListfc)如果当前条件分支η不是路径条件,则可以跳过当前分 支语句块,继续在分支后续节点中遍历查找路径条件输入控制流图G和缺陷模式fsm输出切片准则SC^et
#Step 1 get the defect feature Var - Df (fsm)',
SCSet .Add (Var)\
#Step 2 : get the path condition
#Step 2.1: find all the branches for each n^G
if (OutDegree (n) > 1) then BranchList .add(n);
end
# Step 2.2 ·. traversal branchlist to find path conditions Rverse {BranchList ); for each η e BranchList IsPc { ) - false ;
for each ^ GetBranch V exList {n) if (OutDegree (n') < 2) then if{Var e Re War (n,)) then SCSet ,add (Pc(n)); IsPc(Jt) = true、 break; else if (JsPc(JitJ) then SCSet .add{Pc{n))\ IsPc { ) = true; break ; else
SkipBranch VexList ( ');
end end上面本发明给出了基于缺陷特征的切片准则生成算法1,其主要开销是乂印2中路径条件的查询,假设CRi节点数为N,分支节点数为Q,每个分支语句块的节点数为P (P << N) :Step2. 1对CFG节点进行遍历,将所有条件分支节点加入到BranchList列表中, 复杂度为O(N) ;Step2. 2首先将条件分支列表BranchList逆序,然后依次遍历每个条件 分支语句块GetBranchVexLiStO中是否包含Var,一旦当前节点关联变量包含Var则将 当前路径条件Pc (η)加入到SCSet,同时标志当前路径条件IsPcO = true ;如果存在嵌 套分支结构,通过判断内层分支的路径条件IsPcO,决定是否跳过内层分支语句块的分析 SkipBranchVexList (),复杂度为 O(QXP)0 因此,算法 1 的复杂度为 0(N) +0(QXP)0程序切片算法比较经典的有Weiser基于数据流方程的算法,Ottenstein和 L. M. Ottenstein以及Horwitz的基于程序依赖图的可达性算法,以及基于系统依赖图的 上下文敏感算法等。本发明采用Weiser基于数据流方程的算法,遍历Cre节点,观察当前节 点数据流集合中是否包含算法1切片准则中的相关变量,以确定该节点是否应该被切片, 并根据每个节点的切片标志重构控制流图。算法2 程序切片算法SliceBranchVexList (η)如果条件分支节点η不是路径条件,则将η所在的整个 分支语句块切片掉Slice (η)将η从控制流图中切片掉,将其所有前驱与后继节点相关联输入控制流图G,切片准则SCkt输出切片后的控制流图G'
权利要求
1.应用程序切片技术的静态缺陷检测方法,其特征在于,该方法包括A、获取待检测缺陷模式的缺陷特征;B、根据所述的缺陷特征,计算分支节点处的路径条件,并生成切片准则;C、根据所述的切片准则,遍历控制流图进行程序切片,对控制流图进行重构,得到已重 构的控制流图;D、利用所述已重构的控制流图,应用缺陷状态迭代算法,进行缺陷模式状态机计算;E、若当前控制流图节点为非汇合节点,则将所有缺陷状态中的状态条件进行汇聚及更 新操作;F、如果当前控制流图节点为汇合节点,则按照当前缺陷状态的状态条件进行状态合并。
2.根据权利要求1所述的应用程序切片技术的静态缺陷检测方法,其特征在于,所述 步骤A中的根据待检测缺陷模式获取其缺陷特征的过程具体为Al、根据缺陷模式状态机FSM的创建条件,检测程序中是否有缺陷模式关联的变量,该 缺陷相关变量即为缺陷特征DefectFeature,记为Df(FSM)。
3.根据权利要求1所述的应用程序切片技术的静态缺陷检测方法,其特征在于,所述 步骤B中,根据步骤A计算得到的缺陷特征,遍历控制流图中的所有分支节点n,根据分支语 句块Stmt (η)中是否包含缺陷特征,来确定η是否为路径条件,记为Pc (η),该步骤B进一步 包括;Bi、按节点序遍历控制流图,查询所有出度大于2的节点,将其加入分支语句集合 BranchList,其中可能包含if-else、switch条件分支语句,以及while、do-while、for等 循环语句;B2、将B1得到的BranchList倒置,然后依次遍历其中的每个分支节点Sp 1 itNode,查询 其所包含的语句块Stmt (SplitNode)是否包含缺陷特征Df(FSM);如果不包含,则执行步骤 B3;否则执行步骤B4;B3、当前分支语句块不包含缺陷特征信息,设置其路径条件IsPc = false,使其在后续 的程序切片时可以根据此路径条件标志快速切片掉;B4、当前分支语句块内包含缺陷特征信息,因此将当前分支的条件变量加入路径条件 集合PCSet,同时设置IsPc () = true ;当所述BranchList遍历完毕,则将缺陷特征Df(FSM)与路径条件集合PCSet合并,从 而得到切片准则SCSet。
4.根据权利要求1或3所述的应用程序切片技术的静态缺陷检测方法,其特征在于,步 骤C中根据步骤A和步骤B得到的缺陷特征及路径条件,生成切片准则,然后根据每个控制 流节点的数据流信息进行程序切片,进一步包括Cl、按节点序遍历控制流图,获取每个控制流节点的关联变量信息RelVarSet ;C2、通过比较步骤B中的切片准则SCSet与当前节点的RelVarSet的包含关系进行程 序切片,如果二者交集为空则执行步骤C4 ;否则,执行步骤C3 ;C3、当前节点的数据流信息集合RelVarSet中包含与缺陷检测或路径条件有关的数据 流信息,因此不应该被切片掉,继续执行步骤C2 ;C4、当前节点的数据流信息与缺陷检测及路径条件均无关,因此应该被切片掉,即将被切片掉语句的前驱及后继相连接;切片过程中如果遇到条件分支节点,则通过步骤B计算 得到的路径条件标志IsPcO来决定是否可以对整个条件分支语句块进行快速切片。
5.根据权利要求1所述的应用程序切片技术的静态缺陷检测方法,其特征在于,步骤 E中,从控制流图头节点依次进行状态迭代,每个缺陷状态都关联了当前控制流节点的路径 条件,用当前节点每个变量的抽象取值来表示状态条件;如果当前节点为顺序控制流节点 则进一步包括E1、状态条件汇聚将当前控制流节点η的所有前驱节点进行状态条件合并,得到新的 状态条件作为η的初始状态条件;Ε2、状态条件更新根据当前控制流节点η的数据流信息,更新步骤El中计算得到的初 始状态条件,并根据状态迁移条件判断是否会发生状态迁移;如果状态迁移到Error状态, 则上报一个检测点。
6.根据权利要求4所述的应用程序切片技术的静态缺陷检测方法,其特征在于,步骤 F中如果遇到控制流汇合节点,则根据状态属性State Attribute与步骤Cl得到切片准则 SCSet的包含关系,决定是否进行状态合并,其进一步包括F1、获取所有前驱节点的缺陷状态,如果不是相同状态,则只进行状态条件合并操作, 否则执行步骤F2 ;F2、如果前驱节点的缺陷状态相同,进一步检查其状态属性Attr(State)是否包含于 切片准则SCSet,如果是包含关系则不进行状态合并。
全文摘要
本发明公开一种应用程序切片技术的静态缺陷检测方法,包括A、获取待检测缺陷模式的缺陷特征;B、根据所述的缺陷特征,计算所有分支节点的路径条件,并生成切片准则;C、按照所述的切片准则,遍历控制流图进行程序切片,对控制流图进行重构,得到已重构的控制流图;D、利用所述已重构的控制流图,应用缺陷状态迭代算法,进行缺陷模式状态机计算;E、若当前控制流图节点为非汇合节点,则将所有缺陷状态中的状态条件进行汇聚及更新操作;F、如果当前控制流图节点为汇合节点,则按照当前缺陷状态的状态条件进行状态合并。采用该方法能够在一定程度上提高缺陷检测的效率,并减少基于路径合并策略的路径敏感检测方法的误报。
文档编号G06F11/36GK102110051SQ201010624200
公开日2011年6月29日 申请日期2010年12月31日 优先权日2010年12月31日
发明者刘莉, 宫云战, 杨朝红, 肖庆, 赵云山, 金大海 申请人:北京邮电大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1