一种软件演化过程故障分析方法
【专利摘要】本发明提出了一种软件演化过程故障分析方法,主要用于解决软件在不断演化过程中故障理解和分析问题,包括如下步骤:步骤1、使用AST分析器,构造演化修改程序的中间表示形式抽象语法树EFAGM_AST;步骤2、基于演化修改,确立EFAGM的关键修改节点集,依次构建修改节点集的前向和后向影响节点和路径;步骤3、根据计算EFAGM图节点的域,生成EFAGM的静态影响因子和动态影响因子,完成演化故障分析图模型EFAGM的构建;在故障发生时,采用EFAGM实现对程序演化修改引起的故障分析。本发明不仅可以表示演化修改影响元素及其之间的关系,而且能有效提高演化故障分析的效率。
【专利说明】一种软件演化过程故障分析方法
【技术领域】
[0001] 本发明提出了一种采用演化故障分析模型对软件演化过程进行故障分析的方法, 属于软件调试的【技术领域】。
【背景技术】
[0002] 随着技术的发展和需求的提高,软件不断复杂化和大型化。在这类软件产品开发 和维护过程中,时常伴随着迭代开发、需求变更、性能优化等软件程序演化修改行为,而演 化的进行,增加了引入新的软件程序故障的风险。因此,软件在演化过程中,需要不断的建 模分析,以尽早找到潜在的故障,将软件开发和维护费用降到最低。
[0003] 当软件程序中故障出现时,有以下几种方法:
[0004] (1)最传统简单的方法在程序中插入输出语句。这建立在故障排除人员对程序极 其熟悉,存在很大的主观性,且不适合现代大型复杂软件的故障排除。
[0005] (2)借助调试工具,故障排除人员通常用的手法是设置断点来排除故障,这同样过 于主观,效率不高,造成人员的极大浪费。
[0006] (3)基于程序谱来发现软件中的故障是当前流行的故障定位方案,其缺点在于程 序在演化修改过程中,历史程序谱存在破坏的可能,而且也无法保证Test oracle在修改后 仍然有效。由于故障排除人员未必非常熟悉整个软件程序,他们也很难根据程序元素的可 疑性排除错误的根源。
[0007] (4)采用系统依赖图来进行故障分析。虽然系统依赖图提供了所有程序元素之间 详细的依赖关系,然而在程序不断演化过程中,不断构建系统依赖图,其时间代价和空间代 价是难以估量的,且其不具备演化故障分析能力。
[0008] 基于上述问题,设计高效精确的演化故障分析模型十分必要。如何根据演化修改 高效地构建演化故障分析模型,并可对软件故障提出合理建议显得尤为重要。
【发明内容】
[0009] 本发明所要解决的技术问题是针对【背景技术】的缺陷,提供一种演化故障分析图模 型(Evolution Fault Analysis Graph Model, EFAGM),通过构造演化修改相关的前向依 赖元素、后向依赖元素及其静态和动态影响因子来分析由程序演化修改引起的故障分析问 题。
[0010] 本发明为解决上述技术问题采用以下技术方案:
[0011] 一种软件演化过程故障分析方法,包括以下步骤:
[0012] 步骤1、使用AST分析器,构造演化修改程序的中间表示形式抽象语法树EFAGM_ AST ;
[0013] 步骤2、基于演化修改,确立EFAGM的关键修改节点集,依次构建修改节点集的前 向和后向影响节点和路径;
[0014] 步骤3、根据计算EFAGM图节点的域,生成EFAGM的静态影响因子和动态影响因子, 完成演化故障分析图模型EFAGM的构建;在故障发生时,采用EFAGM实现对程序演化修改引 起的故障分析。
[0015] 进一步的,本发明的一种软件演化过程故障分析方法,步骤1所述EFAGM是一个二 元组〈CINode,CDEdge〉,其中,CINode为修改影响节点集,CDEdge为修改依赖边集;
[0016] 修改影响节点集 CINode 包括常见节点 BlockNode、IfNode、SwitchNode、 WhileNode、DoNode、ForNode、BreakNode、ContinueNode、ReturnNode、InvocationNode、 MethodNode ;
[0017] 修改依赖边集 CDEdge = DCDEdge U ICDEdge U DDDEdge U IDDEdge,其中, D⑶Edge是直接控制依赖边集,I⑶Edge是间接控制依赖边集,DDDEdge是直接数据依赖边 集,IDDEdge是间接数据依赖边集;
[0018] EFAGM图节点的域,包括:
[0019] (I) ID域:用于演化修改影响的节点或边的标识,节点或边的ID标识是唯一的;
[0020] (2)Position域:对应图节点元素在程序中的位置;
[0021] (3)ParentNodeLink域:当前节点的父节点链域,用于链接当前节点的父节点,便 于EFAGM图的前向遍历;若当前节点若存在变量使用并受多个节点变量定义影响或同时受 到前向数据和控制影响,则将ParentNodeLink链接多个父节点,否则只链接一个父节点; 当前节点若存在变量使用并受多个节点变量定义影响或同时受到前向数据和控制影响, ParentNodeLink链接多个父节点,否则链接一个节点;
[0022] (4) ChiIdNodeLink域:当前节点的孩子节点链域,用于链接当前节点的孩子节 点,便于 EFAGM 图的后向遍历;对于 IfNode、SwitchNode、WhileNode、DoNode、ForNode、 MethodNode类型的条件判断语句的ChildNodeLink域,或者当前节点若存在变量定义或定 值并影响多个节点的使用,则链接多个孩子节点;否则只链接一个孩子节点;对于IfNode、 SwitchNode、WhileNode、DoNode、ForNode、MethodNode 条件判断语句的 ChildNodeLink 域链接多个孩子节点;当前节点若存在变量定义或定值并影响多个节点的使用, ChildNodeLink域也链接多个孩子节点;否则,ChildNodeLink域只链接一个孩子节点;
[0023] (5)ChangeNum、AveDistance域:影响当前节点的修改节点的个数、与修改节点 的最小距离,令1?,!?. ..,mn为当前节点与程序中η个修改节点的距离,则AveDistance = (m1+m2+***+mn)/n ;
[0024] (6) StaticWeight域:静态分析得出的当前节点发生故障的概率,其计算公式为
【权利要求】
1. 一种软件演化过程故障分析方法,其特征在于,包括以下步骤: 步骤1、使用AST分析器,构造演化修改程序的中间表示形式抽象语法树EFAGM_AST; 步骤2、基于演化修改,确立EFAGM的关键修改节点集,依次构建修改节点集的前向和 后向影响节点和路径; 步骤3、根据计算EFAGM图节点的域,生成EFAGM的静态影响因子和动态影响因子,完成 演化故障分析图模型EFAGM的构建;在故障发生时,采用EFAGM实现对程序演化修改引起的 故障分析。
2. 根据权利要求1所述的一种软件演化过程故障分析方法,其特征在于,步骤1所述 EFAGM是一个二元组〈CINode,CDEdge〉,其中,CINode为修改影响节点集,CDEdge为修改依 赖边集; 修改影响节点集CINode包括常见节点BlockNode、IfNode、SwitchNode、WhileNode、DoNode、ForNode、BreakNode、ContinueNode、ReturnNode、InvocationNode、MethodNode; 修改依赖边集CDEdge=DCDEdgeUICDEdgeUDDDEdgeUIDDEdge,其中,DCDEdge是 直接控制依赖边集,ICDEdge是间接控制依赖边集,DDDEdge是直接数据依赖边集,IDDEdge 是间接数据依赖边集; EFAGM图节点的域,包括: (1) ID域:用于演化修改影响的节点或边的标识,节点或边的ID标识是唯一的; (2)Position域:对应图节点元素在程序中的位置; (3) ParentNodeLink域:当前节点的父节点链域,用于链接当前节点的父节点,便于 EFAGM图的前向遍历;若当前节点若存在变量使用并受多个节点变量定义影响或同时受 到前向数据和控制影响,则将ParentNodeLink链接多个父节点,否则只链接一个父节点; 当前节点若存在变量使用并受多个节点变量定义影响或同时受到前向数据和控制影响, ParentNodeLink链接多个父节点,否则链接一个节点; (4)ChiIdNodeLink域:当前节点的孩子节点链域,用于链接当前节点的孩子节点, 便于EFAGM图的后向遍历;对于IfNode、SwitchNode、WhileNode、DoNode、ForNode、 MethodNode类型的条件判断语句的ChildNodeLink域,或者当前节点若存在变量定义或定 值并影响多个节点的使用,则链接多个孩子节点;否则只链接一个孩子节点;对于IfNode、 SwitchNode、WhileNode、DoNode、ForNode、MethodNode条件判断语句的ChildNodeLink 域链接多个孩子节点;当前节点若存在变量定义或定值并影响多个节点的使用, ChildNodeLink域也链接多个孩子节点;否则,ChildNodeLink域只链接一个孩子节点; (5)ChangeNum、AveDistance域:影响当前节点的修改节点的个数、与修改节点的 最小距离,令1?,!?. ..,mn为当前节点与程序中η个修改节点的距离,则AveDistance= (m1+m2+***+mn)/n; (6)StaticWeight域:静态分析得出的当前节点发生故障的概率,其计算公式为 StaticWeight= -- -7·其中 m表不影响ActiveNode的ChangeNum域;当 iAveDisidiXice+l' 演化修改引起故障时,当前节点的故障概率遵循: a) 与修改节点距离越近,发生故障的概率越高; b) 被影响的修改节点数目越多,发生故障的概率越高; C)修改节点随着数目的增加,其影响力逐渐减小; (7)DynamicWeight域:用于动态分析得出的当前节点发生故障的概率,其计算公式 为:
其中,s是根据测试历史信息与预言相冲突的测试数目,t是根据测试历史信息与预言 一致的测试数目,Y是调节因子;当演化修改引起故障时,当前节点的故障概率遵循: a) 经过当前节点的失效测试用例越多,发生故障的概率越高; b) 经过当前节点的成功测试用例越多,发生故障的概率越小; c) 随着失效测试用例数目的增多,失效测试用例对故障发生的概率分析影响越小; d) 随着失效测试用例数目的增多,成功测试用例对故障发生的概率分析影响越小。
3. 根据权利要求2所述的一种软件演化过程故障分析方法,其特征在于,步骤2中基 于演化修改,确立关键修改节点集为:在初始时,EFAGM模型中只包括η个演化修改节点 cNodel,...,cNoden;EFAGM图中在加入一个节点的同时设置ID和Position域值,在创 建一条边的同时设置ParentNodeLink和ChildNodeLink域值;在实现时,调用方法ast. creatAST(replace)生成源程序replace的EFAGM_AST代码树,并返回根节点。
4. 根据权利要求3所述的一种软件演化过程故障分析方法,其特征在于,步骤2中所述 依次构建修改节点集的前向和后向影响节点和路径;具体为: 2. 1)基于cNodel. getNodeType()方法判定cNodel的节点类型,构造cNodel的前向控 制节点、前向数据节点及相关依赖边;当前节点的修改会引起控制它的节点的更新,同时, 当前节点使用的变量修改会引起变量定义或定值节点的一致性检查; 2. 2)构造cNodel的后向控制节点、后向数据节点及相关依赖边;当前节点若为控制节 点,它的修改会影响控制块中所有节点的执行;当前节点中若定义或定值了变量,则所有使 用定义或定值集中变量的节点都将会受到影响; 2. 3)重复2. 1)?2. 2),创建其他修改节点cNode2到cNoden的前向影响节点和后向 影响节点,并将所有未加入到EFAGM中的节点加入其中,创建ECDEdge、I⑶Edge、DDDEdge、 IDDEdge。
5. 根据权利要求4所述的一种软件演化过程故障分析方法,其特征在于,步骤3具体 为: 3. 1)更新EFAGM图中每个节点的ChangeNum域和AveDistance域;令当前节点为 ActiveNode,ChangeNum值为ActiveNode根据ParentNodeLink域或ChildNodeLink域可 达的修改节点个数;AveDistance的计算分两步:首先,计算ActiveNode到每个可达修改节 点i的最小距离mini,然后计算AveDistance,计算公式为也eitetance= 其中,m为 ChangeNum值; 3.2)根据ChangeNum域和AveDistance域计算EFAGM图中每个节点的StaticWeight 值;令当前节点为ActiveNode,则计算公式为:StaticWeight1-^ ;其 中m表示影响ActiveNode的ChangeNum域,在EFAGM图上表现为正向或逆向可达,冗=1了 表示对ActiveNode的影响的修改节点越多,则影响力越大,且随着影响的修改节点增多, 影响力逐渐降低,-一-^表示AveDistance越大,演化修改节点对ActiveNode 影响越小,且由于AveDistance对ActiveNode影响力要小于修改节点个数的影响力,将 AveDistance的影响力限制在(0, 1]之间,即^-----e⑴,1];根据计算公式,受影 A veDtsIance +1 响的修改节点数目越多,则StaticWeight越大,受影响的修改节点数目相同,而距离越近,StaticWeight越大,当演化修改引起故障时,根据StaticWeight的大小顺序对故障进行排 查; 3. 3)根据测试历史信息计算DynamicWeight,如果演化修改后TestOracle仍然有效, 通过测试运行的失效与否更加精确的计算演化故障的概率,其计算公式为:
其中,s是根据测试历史信息与预言相冲突的测试数目,t是根据测试历史信息与预言 一致的测试数目;+表示第i个冲突测试数目对权重的影响因子,随着测试数目的增加,测 试对权重的影响不断减小,Ye[〇, 0.5]是调节因子,其大小由测试用例规模决定,一般情 况下,由于测试用例规模规模较大,我们默认取Y= 〇. 5,当i>10000时,|<〇·〇1,其对权重 的影响可以忽略不计,当测试用例规模很小时,将测试对权重的影响不断减小忽略不计,即 令Y= 0,这样,所有测试对权重的影响因子均为1 ; 3. 4)完成EFAGM的构建,故障发生时,根据EFAGM节点元素关系以及StaticWeight、DynamicWeght域值等级来确定故障的根源。
6.根据权利要求书4所述的一种软件演化过程故障分析方法,其特征在于,步骤2. 1) 具体步骤如下: 2.I. 1)在EFAGM_AST上提取cNodel的前驱控制节点ParentVertexl,ParentVertexl 的节点类型有IfNode、SwitchNode、WhileNode、DoNode、ForNode、MethodNode,加入 ParentVertexl到EFAGM图中,更新cNodeI的ParentNodeLink域,以便于EFAGM的遍历 操作,并创建直接控制依赖边DCDEdge(ParentVertexl,cNodel),cNodel的修改会引起 ParentVertexl的修改检查; 2.L2)提取ParentVertexl的直接前驱控制节点ParentVertex2,加入到EFAGM图中,设置ParentVertexl的ParentNodeLink域,并创建间接控制依赖边 KDEdge(ParentVertex2,ParentVertexl);如果由于节点cNodel的修改引起了故障的发 生,那么节点的cNodel可疑性要大于节点ParentVertexl、节点的ParentVertexl可疑性要 大于节点ParentVertex2 ; 2. 1.3)重复2.I. 2),创建所有间接控制依赖节点和相应边,不断的波动影响,直至将 相关的节点元素包括进来; 2. 1. 4)根据cNodel.getExpressionO方法提取cNodel中的表达式,并生成表达式 变量使用集v_use,基于EFAGM_AST,加入V_use中所有变量的的直接前驱定义或定值节点 Vertexl到EFAGM中,并创建数据依赖边DDDEdge(Vertexl,cNodel); 2. 1. 5)生成Vertexl中表达式变量集vl,基于EFAGM_AST,加入vl中所有变量的直接 前驱节点Vertex2到EFAGM中,并创建数据依赖边IDDEdge(Vertex2,Vertexl); 2.I. 6)重复2.I. 5),创建所有间接数据依赖节点和相应边,同时需要不断的对数据类 型和数据值同步更新检查,直到数据类型的初始定义结束; 2. 1. 7)如果节点类型为WhileNode、DoNode、ForNode,则这些节点的直接前驱数据节 点和控制节点除了自然顺序之前的节点,还包括节点控制块之中的控制变量定值节点和跳 转节点,令WhileBlock、DoBlock、ForBlock中的控制变量定值或跳转节点为Vertexl,加入 Vertexl到EFAGM中,并创建依赖边DCDEdge(Vertexl,cNodel); 2. 1.8)如果节点类型为MethodNode,则其直接前驱节点为调用该MethodNode的语句 节点,MethodNode的修改会引起相应的CallVertex的同步更新,基于EFAGM_AST,加入调用 节点CallVertex,并创建依赖边DCDEdge(CallVertex,cNodel)。
7.根据权利要求书6所述的一种软件演化过程故障分析方法,其特征在于,步骤2. 2) 具体步骤如下: 2. 2. 1)如果节点类型为IfNode、SwitchNode、WhileNode、DoNode、ForNode、MethodNode,则这些节点的修改会引起语句块中的顺序节点是否执行,分别创建IFBlock、 SwitchCase、WhiIeBlock、DoBlock、ForBlock、MethodBlock语句块下的顺序节点Vertexl, 并创建直接控制依赖边DCDEdge(cNodel,Vertexl); 2· 2· 2)如果Vertexl节点类型为IfNode、SwitchNode、WhileNode、DoNode、ForNode、MethodNode,分别创建IFBlock、SwitchCase、WhileBlock、DoBlock、ForBlock、MethodBlock 下的语句节点Vertexl,并创建间接控制依赖边KDEdge(Vertexl,Vertex2); 2. 2. 3)重复2. 2. 2)创建所有间接控制依赖节点和依赖边,修改不断的传播,直到普通 的语句节点BlockNode为止; 2. 2. 4)根据cNodeLgetExpressionO方法提取cNodel中的表达式,并生成表达式变 量定义集v_def,基于EFAGM_AST,加入v_def中所有变量的的直接后继使用节点Vertexl 到EFAGM中,并创建数据依赖边DDDEdge(cNodel,Vertexl); 2. 2. 5)生成Vertexl中表达式变量定义集v_defl,基于EFAGM_AST,加入v_defl中所有变量的直接后继引用节点Vertex2到EFAGM中,并创建数据依赖边 IDDEdge(Vertexl,Vertex2); 2. 2. 6)重复2. 2. 5),创建所有间接数据依赖节点和相应边,直到没有新的变量的定值 和修改为止; 2. 2. 7)如果节点类型为ReturnNode,则此节点控制返回到方法,遍历EFAGM_AST, 加入调用ReturnNode节点所在方法的节点Vertexl,创建数据依赖边DDDEdge(cNodel, Vertexl); 2. 2. 8)如果节点类型为fceakNode,遍历EFAGM_AST, 若cNodel所在的WhileNode、DoNode、ForNode中的语句节点为Vertexl,则BreakNode的修改直接决定着Vertexl是否执行,创建控制依赖边DCD(cNodel,Vertexl); 同时,WhileBlock、DoBlock、ForBlock中的BreakNode的后续语句也直接受BreakNode、 ContinueNode的控制,遍历EFAGM_AST,令后续语句为Vertex2,加入Vertex2节点到EFAGM 中,并创建(cNodel,Vertex2); 若cNodel所在的语句块为SwitchCase,则BreakNode控制语句块中cNode中下一个BreakNode之前的语句,遍历EFAGM_AST,令Vertexl为所在语句块的cNodel的后续语句到 下一个BreakNode之前的语句,创建DCD(cNode1,Vertexl); 2. 2. 9)如果节点类型为ContinueNode,遍历EFAGM_AST,若cNodel所在的WhileNode、DoNode、ForNode中的语句节点为Vertexl,则ContinueNode的修改直接决定着跳转 Vertexl的执行,创建控制依赖边DCD(cNodel,Vertexl);同时,WhileBlock、DoBlock、 ForBlock中的ContinueNode的后续语句的执行与否也受ContinueNode的控制,遍 历EFAGM_AST,令后续语句为Vertex2,加入Vertex2节点到EFAGM中,并创建(cNodel, Vertex2); 2. 2. 10)如果节点类型为InvocationNode,遍历EFAGM_AST,令调用方法节点 为Vertexl,加入Vertexl到EFAGM中,并创建控制依赖边和数据依赖边DCD(cNodel, Vertexl); 2. 2. 11)以cNodel的直接数据影响和控制影响节点为新分析节点,创建2. 2. 7)? 2. 2. 10)的cNodel所有间接数据影响和控制控制影响节点,并创建边IDDEdge、ICDEdge,直 到没有新的节点和边加入为止。
【文档编号】G06F11/36GK104461867SQ201410623526
【公开日】2015年3月25日 申请日期:2014年11月8日 优先权日:2014年11月8日
【发明者】文万志, 陈建平, 陈翔, 郑国平, 蒋峥峥, 顾卫江, 彭志娟 申请人:南通大学