首页> 中国专利> 一种基于演化切片的演化影响集预测方法

一种基于演化切片的演化影响集预测方法

摘要

本发明提供一种基于演化切片的演化影响集预测方法,主要用于构建演化影响集以辅助软件开发者和维护者作出演化策略,包括如下步骤:识别演化元素;生成演化切片准则;构建演化数据依赖图;构建演化控制依赖图;生成演化切片作为演化影响集;度量演化影响集。本发明公开的基于演化切片的演化影响集预测(ESISP)方法具有较高的查全率和较低的存伪率,能有效辅助软件开发人员和维护人员作出相关决策。

著录项

  • 公开/公告号CN106844218A

    专利类型发明专利

  • 公开/公告日2017-06-13

    原文格式PDF

  • 申请/专利权人 南通大学;

    申请/专利号CN201710076573.6

  • 申请日2017-02-13

  • 分类号G06F11/36;

  • 代理机构北京科亿知识产权代理事务所(普通合伙);

  • 代理人汤东凤

  • 地址 226019 江苏省南通市崇川区啬园路9号

  • 入库时间 2023-06-19 02:35:50

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2020-06-23

    授权

    授权

  • 2017-07-07

    实质审查的生效 IPC(主分类):G06F11/36 申请日:20170213

    实质审查的生效

  • 2017-06-13

    公开

    公开

说明书

技术领域

本发明属于软件演化影响分析技术领域,具体涉及一种基于演化切片的演化影响集预测方法。

背景技术

随着软件技术的发展,软件规模越来越大,软件在开发和维护过程中,软件故障修复、功能改进等需要不断的迭代演化软件,然而针对某一软件演化需求,其可行性以及演化实施策略都需要对可能的演化影响元素进行分析,例如:软件演化引起修改的程序规模偏大,从而造成演化成本过高,演化过程不可进行;软件演化影响了不可修改的核心代码,从而导致不可行;同一需求,多种演化方案的选择问题等等。

演化影响分析技术主要通过预测演化影响集来辅助软件开发者和维护者,演化影响分析技术的效率高低直接影响了技术使用信心。演化影响分析的实施即可以在需求设计层进行,也可以在代码层进行。当前,基于代码层的技术主要有基于调用图的演化影响分析技术、基于概念格的演化影响分析技术、基于修改历史挖掘的方法、基于依赖图的方法。

程序切片是一种基于依赖分析的技术,这种技术根据程序中兴趣点和兴趣元素提取的程序片段,在软件错误定位、程序理解、重构等软件开发和维护过程中均有广泛的应用。当前针对大规模的频繁修改的软件,使用程序切片可以将分析规模缩小在一个较小的范围,便于进行演化影响分析。

基于以上叙述,软件处于不断的迭代演化中,针对同一需求实施何种演化方案以及演化后造成的潜在关联影响都需要进行有效的演化影响分析,精确的预测演化影响集能高效地辅助软件开发维护人员作出决策,提高软件开发和维护效率。

发明内容

本发明要解决的技术问题是提供一种基于演化切片的演化影响集预测方法,具有较高的查全率和较低的存伪率,能有效辅助软件开发人员和维护人员作出相关决策。

为解决上述技术问题,本发明的实施例提供一种基于演化切片的演化影响集预测方法,包括如下步骤:

(1)识别演化元素;

(2)生成演化切片准则;

(3)构建演化数据依赖图;

(4)构建演化控制依赖图;

(5)构建演化切片;

(6)以步骤(5)中的演化切片作为预测演化影响集,度量其有效性。

进一步,所述步骤(1)~(5)具体描述如下:

(1)识别源程序P的演化程序PE中演化元素及其类型ctC、ctA、ctD,其中,ctC表示对P中元素的修改,ctD表示对P中元素的删除,ctA表示在P中增加了元素;

(2)基于源程序P和演化程序PE,生成演化切片准则ESC;

(3)基于源程序P和演化程序PE,构建演化数据依赖关系,根据所述的演化数据依赖关系构建演化数据依赖图,其中,图结点表示演化数据元素,边表示结点间存在数据依赖关系;

(4)基于源程序P和演化程序PE,构建演化控制依赖关系,根据所述的演化控制依赖关系构建演化控制依赖图,其中,图结点表示演化控制元素,边表示结点间存在控制依赖关系;

(5)基于步骤(2)中的演化切片准则、步骤(3)中演化数据依赖图和步骤(4)中的演化控制依赖图,构建演化切片;

(6)以步骤(5)中的演化切片作为预测演化影响集,度量其有效性。

其中,所述步骤(1)中使用两步比较法识别源程序P的演化程序PE中演化元素及其类型ctC、ctA、ctD,设定源程序P的良性演化为不宜变动源程序P中50%以上的代码,否则视为恶性演化,演化影响预测终止,具体步骤如下:

(1-1)自顶向下遍历源程序P及其演化程序PE,初始时P.node指向P中第一条语句或表达式,PE.node指向PE中第一条语句或表达式;

(1-2)若P.node==PE.node,则P.node, PE.node分别指向下一条语句,即P.node=P.node->next, pE.node=PE.node->next,转(1-2),否则转(1-3);

(1-3)自顶向下匹配P.node结点和PE.node的后继结点PE.node1,若找到匹配结点,则设定演化类型为ctA,演化元素为PE.node1与PE.node之间部分,演化规模为|PE.node1-PE.node|(绝对值表示结点之间元素个数),转(1-6),否则转(1-4);

(1-4)自顶向下匹配P.node的后继结点P.node1和PE.node的后继结点PE.node1,若找到匹配结点,则设定演化类型为ctC,演化元素为P.node1与P.node之间部分,演化后元素为PE.node1与PE.node之间部分,演化规模为|P.node1- P.node|,转(1-6),否则转(1-5);

(1-5)自顶向下匹配P.node的后继结点P.node1和PE.node结点,若找到匹配结点,则设定演化类型为ctD,演化元素为P.node1与P.node之间部分,演化后元素为P.node1与P.node之间部分,演化规模为|P.node1- P.node|,转(1-6);

(1-6)若未跳转过(1-3)、(1-4)、(1-5),交换(1-3),(1-4),(1-5)步骤中P和PE, ctA和ctC,执行(1-3),(1-4),(1-5),记录下演化类型Etype,演化规模Esize, 演化元素集E;

(1-7)从初次执行(1-3),(1-4),(1-5)所得演化类型与Etype中选取演化规模小的演化类型作为最终的演化类型,并将相应的演化元素作为最终的识别元素。

其中,所述步骤(2)中生成的演化切片准则ESC是一个三元组<E,V,CT>,其中,E={e1,e2,…,em}为P的演化元素集合,V为演化元素中定义的变量集合,CT={ctC,ctD,ctA}为演化类型集合,ctC表示对P中元素的修改,ctD表示对P中元素的删除,ctA表示在P中增加了元素。

上述定义中,演化元素为P中的类、方法或语句,V为在演化元素ej中定义的变量集合,通常,对演化元素ej中的变量重新修改定值会影响引用它的变量的值。演化类型的不同,其演化影响元素会有所不同,演化类型为ctC既影响演化前的数据传播和控制传播,也影响演化后的数据传播和控制传播,而ctD删除了相关元素,影响演化前本已存在的数据传播和控制传播,ctA增加了数据传播和控制传播,不同的修改类型,修改分析不同。

其中,所述步骤(3)中,演化数据依赖关系的定义如下:

令演化元素集合E={ec1,ec2,…,ecp}∪{ed1,ed2,…,edq}∪{ea1,ea2,…,ear},其中eck(k=1,…p)、edl(l=1,…q)、eas(s=1,…r)分别表示演化后修改的元素、演化中删除的元素和演化后新增的元素,其修改类型依次为ctC、ctD、ctA,且ec1,ec2,…,ecp演化前的元素分别为ec1’,ec2’…,ecp’,则:

演化元素e1演化数据依赖于e2,当且仅当:a、存在v∈USE(e1)∩DEF(e2),且e2可达e1,任意e’∈PATH(e2,e1),v∉USE(e’)∩DEF(e2);b、若e2∈{ec1,ec2,…,ecp},v∈USE(e1)∩DEF(e2’),且e2’可达e1,任意e’∈PATH(e2’,e1),>2’),记作:

上述定义中,演化数据依赖取决于演化后程序元素,演化数据会传播影响其他数据元素,同时,对于演化类型ctC,演化前的程序元素处数据有可能被修改,会影响到相关依赖元素。程序在不断的演化过程中,针对不同的演化方案重新构造依赖关系代价非常大,因此基于源程序及演化元素进行迭代构造。演化数据依赖关系通过演化数据依赖图来表示,图结点表示演化数据元素,边表示结点间存在数据依赖关系,演化数据依赖图的构造步骤如下:

(3-1)初始时,演化元素集E={e1,e2,…,em},演化数据依赖图结点集合EDNode>1,e2,…,em},边集合EDEdge=Φ并创建源程序P的代码分析树ASTree;

(3-2)对于每个E中元素,如果其演化类型为ctC或ctD,定位ei在ASTree相应演化前结点B(ei),对每个ASTree上B(ei)可达结点ej,如果,则EDNode= EDNode∪{ei,ej},EDEdge=EDEdge∪{<ei,ej>};

(3-3)对于每个E中元素,如果其演化类型为ctC或ctA,定位ei在ASTree相应结点,对每个ASTree上ei可达结点ej,如果,则EDNode= EDNode∪{ei,ej},EDEdge=EDEdge∪{<ei,ej>}。

上述步骤中,对于修改结点,不但要记录修改前的结点依赖,还要记录修改后的结点依赖,依赖关系均从同一个结点引出,标记为<ei,ej>;对于删除结点,只要根据修改前分析树构造演化数据依赖;对于新加入结点,则要构造新的分析树结点,并插入到相应父结点下、孩子结点之上,然后构造演化数据依赖。这种构造方法,避免了重复的构造分析树,以提高数据依赖关系的提取。

其中,所述步骤(4)中,演化控制依赖关系的定义如下:

令演化元素集合E={ec1,ec2,…,ecp}∪{ed1,ed2,…,edq}∪{ea1,ea2,…,ear},其中eck(k=1,…p)、edl(l=1,…q)、eas(s=1,…r)分别表示演化后修改的元素、演化中删除的元素和演化后新增的元素,其修改类型依次为ctC、ctD、ctA,且ec1,ec2,…,ecp演化前的元素分别为ec1’,ec2’…,ecp’,则:

演化元素e1演化控制依赖于e2,当且仅当:a、e2为谓词结点,存在PATH(e2,e1),e1∉MUSTPASS(e2),任意e’∈PATH(e2,e1),e1∈MUSTPASS(e’);b、若e2∈{ec1,ec2,…,ecp},e2’为谓词结点,存在PATH(e2’,e1),e1∉MUSTPASS(e2’),任意e’∈PATH(e2’,e1),e1∈MUSTPASS(e’);,记作:

上述定义中,演化控制依赖关系需满足三个条件:首先,演化前后元素必须是谓词结点;其次,演化前后元素可达另一个元素,且并非必经另一个元素;再次,任何可达路径中的程序元素必经另一元素。第二个条件保证了可达性并且可以根据条件选择执行,第三个条件决定了,是演化元素控制的执行,不是演化元素后面的谓词语句。与演化数据依赖关系类似,演化控制依赖通过演化控制依赖图来实现,图结点表示演化数据元素,边表示结点间存在演化数据依赖关系。基于源程序构造演化程序分析树,其演化控制依赖关系的构造过程如下:

(4-1)′生成演化程序代码分析树ASTree;

(4-2)′若演化类型为ctC,且修改前元素为谓词元素,构建修改前元素的控制依赖关系;如果修改后元素为谓词,更新代码分析树,构建修改后元素的控制依赖关系;

(4-3)′若演化类型为ctD,且删除元素为谓词元素,构建谓词元素的控制依赖关系;

(4-4)′若演化类型为ctA,且添加元素为谓词元素,生成代码分析结点,插入结点到相应代码分析树位置,然后构建演化元素依赖关系;

步骤(4-2)′、(4-3)′和(4-4)′中,如果演化前后元素不是谓词结点,则不存在控制依赖关系,这里算法的关键是一旦确定演化前后元素是谓词结点,如何构造演化控制依赖图。演化元素结点e的演化控制依赖图的步骤如下:

(4-1)初始时,演化元素结点为e,演化分析树为ASTree,演化控制依赖图G为<ECNode,ECEdge>,其中,ECNode为演化影响结点结合,ECEdge是演化控制依赖边集合;

(4-2)如果e的结点类型非谓词结点,转(4-6);

(4-3)在ASTree上对每一个e的可达结点ei,如果ei是e的后必经结点,转(4-6);

(4-4)若e’为e到达ei的路径上的任一结点,且e’不是e的后必经结点,转(4-6);

(4-5)更新演化控制依赖图G,加入演化结点和相应边,即ECNode= ECNode∪{e,ei},ECEdge= ECEdge∪{<ei,ej>};

(4-6)返回演化控制依赖图G。

其中,所述步骤(5)中的演化切片是根据演化元素提取的程序片段,记录了演化元素的影响部分,其定义如下:

P为源程序,<E,V,CT>为演化切片准则,基于切片准则生成的演化控制依赖图为G=<EDNode∪ECNode,EDEdge∪ECEdge>,则演化切片ESlice是演化程序元素结点的集合EDNode∪ECNode∪INode,其中,INode是基于EDNode∪ECNode-E生成的间接数据依赖和控制依赖结点结合。

演化切片主要记录了演化元素影响的程序元素。EDNode记录了直接数据影响的元素,ECNode记录了直接控制影响的元素。然而,影响会不断传播,受影响的元素又会影响其他元素,不断迭代,最终生成演化切片。

其中,所述步骤(6)中,基于演化切片的演化影响集的有效性主要取决于预测的影响集的精度以及存伪度,通过查全率recall和查准率NPrecision来度量,而演化识别率从一定程度上影响了精度和存伪度,演化元素的识别通过识别率和误判率进行度量,具体度量方法如下:

式(Ⅰ),

式(Ⅱ),

式(Ⅰ)中,为识别率,为识别出的实际演化元素数目,为所有实际演化元素数目;式(Ⅱ)中,为误判率,为识别出的非实际演化元素数目,为识别出的全部演化数目,即,显然,值越大,识别率越高,元素识别越准确,越有利于演化影响分析的进行;值越大,误判率越高,越影响后续的演化影响分析,理想情况下,==0,即识别率为百分之百,误判率为0,此时识别的元素集合与实际修改的元素集合相同;

式(Ⅲ),

式(Ⅳ),

式(Ⅲ)和(Ⅳ)中,ES是通过计算演化切片获得的预测演化影响集,RI是实际演化影响集,recall值越大,查全率越高,能够正确预测实际演化元素比例越多;当RIES时,recall达到理想值1,表示演化切片能够预测出全部的实际演化元素;Nprecision值越小,表示预测存伪情况越小,当RI=ES时,Nprecision达到理想值0。

本发明的上述技术方案的有益效果如下:本发明公开的基于演化切片的演化影响集预测(ESISP)方法具有较高的查全率和较低的存伪率,能有效辅助软件开发人员和维护人员作出相关决策。

附图说明

图1为本发明ESISP方法的流程。

图2是演化元素识别程序示例图。

图3是演化切片生成示例图。

图4是实例识别率结果图。

图5是实例误判率结果图。

图6是实例查全率和存伪率结果图。

具体实施方式

为使本发明要解决的技术问题、技术方案和优点更加清楚,下面将结合附图及具体实施例进行详细描述。

一种基于演化切片的演化影响集预测(ESISP)方法,主要用于构建演化影响集以辅助软件开发者和维护者作出演化策略,包括如下步骤:识别演化元素;生成演化切片准则;构建演化数据依赖图;构建演化控制依赖图;构建演化切片;以演化切片作为预测演化影响集,度量其有效性。该方法的流程图如图1所示。

一、演化元素的识别

演化切片有利于分析演化影响元素。基于演化切片的演化影响分析技术依赖于演化元素的识别,演化元素识别度越高,则影响元素分析越准确。

(1)使用两步比较法识别源程序P的演化程序PE中演化元素及其类型ctC、ctA、ctD,其中,ctC表示对P中元素的修改,ctD表示对P中元素的删除,ctA表示在P中增加了元素。本发明设定一个源程序P的良性演化不宜变动源程序P中绝大部分(50%以上)代码,否则视作恶性演化,演化影响预测终止。具体步骤如下:

(1-1)自顶向下遍历源程序P及其演化程序PE,初始时P.node指向P中第一条语句或表达式,PE.node指向PE中第一条语句或表达式;

(1-2)若P.node==PE.node,则P.node, PE.node分别指向下一条语句,即P.node=P.node->next, pE.node=PE.node->next,转(1-2),否则转(1-3);

(1-3)自顶向下匹配P.node结点和PE.node的后继结点PE.node1,若找到匹配结点,则设定演化类型为ctA,演化元素为PE.node1与PE.node之间部分,演化规模为|PE.node1-PE.node|(绝对值表示结点之间元素个数),转(1-6),否则转(1-4);

(1-4)自顶向下匹配P.node的后继结点P.node1和PE.node的后继结点PE.node1,若找到匹配结点,则设定演化类型为ctC,演化元素为P.node1与P.node之间部分,演化后元素为PE.node1与PE.node之间部分,演化规模为|P.node1- P.node|,转(1-6),否则转(1-5);

(1-5)自顶向下匹配P.node的后继结点P.node1和PE.node结点,若找到匹配结点,则设定演化类型为ctD,演化元素为P.node1与P.node之间部分,演化后元素为P.node1与P.node之间部分,演化规模为|P.node1- P.node|,转(1-6);

(1-6)若未跳转过(1-3)、(1-4)、(1-5),交换(1-3),(1-4),(1-5)步骤中P和PE,ctA和ctC,执行(1-3),(1-4),(1-5),记录下演化类型Etype,演化规模Esize, 演化元素集E;

(1-7)从初次执行(1-3),(1-4),(1-5)所得演化类型与Etype中选取演化规模小的演化类型作为最终的演化类型,并将相应的演化元素作为最终的识别元素。

当程序修改前后代码不同时,修改前代码依次与修改后代码比较,如果增加了程序元素,在演化程序中必然能找到源程序增加点下一条语句;如果修改或删除了元素,因为源程序中修改或删除的元素在修改后找不到匹配元素,且后续语句能找到匹配元素,依据被修改元素的比较点,可以判断出修改点和删除点。然而,当程序修改前后代码存在高度相似性时,简单的代码比较存在造成误判的可能。

如图2中,程序1所做的修改是删除了代码段1下的代码A。当修改前代码依次与修改后代码比较时,代码A与代码段2后代码A相匹配,识别的结果是代码段2为增加的代码,而原程序中代码段2、代码A为删除的代码。程序2所做的修改是修改了代码段1下代码A为代码B。当修改前代码依次与修改后代码比较时,代码A与代码3后代码A相匹配,识别的结果是代码B和代码3为增加的代码,而原程序中的代码段3和代码段A为删除的代码。

二、演化切片构建方法

演化切片基于演化切片准则、演化数据依赖图和演化控制依赖图构建而成。

(2)基于源程序P和演化程序PE,生成演化切片准则ESC,其定义如下:

令P原程序,演化切片准则是一个三元组<E,V,CT>,其中,E={e1,e2,…,em}为P的演化元素集合,V为演化元素中定义的变量集合,CT={ctC,ctD,ctA}为演化类型集合,ctC表示对P中元素的修改,ctD表示对P中元素的删除,ctA表示在P中增加了元素。

上述定义中,演化元素为P中的类、方法或语句,V为在演化元素ej中定义的变量集合,通常,对演化元素ej中的变量重新修改定值会影响引用它的变量的值。演化类型的不同,其演化影响元素会有所不同,演化类型为ctC既影响演化前的数据传播和控制传播,也影响演化后的数据传播和控制传播,而ctD删除了相关元素,影响演化前本已存在的数据传播和控制传播,ctA增加了数据传播和控制传播。不同的修改类型,修改分析不同。

(3)基于源程序P和演化程序PE,构建演化数据依赖关系,演化数据依赖关系通过演化数据依赖图来表示,图结点表示演化数据元素,边表示结点间存在数据依赖关系。演化数据依赖关系的定义如下:

令演化元素集合E={ec1,ec2,…,ecp}∪{ed1,ed2,…,edq}∪{ea1,ea2,…,ear},其中eck(k=1,…p)、edl(l=1,…q)、>as(s=1,…r)分别表示演化后修改的元素、演化中删除的元素和演化后新增的元素,其修改类型依次为ctC、ctD、ctA,且ec1,ec2,…,ecp演化前的元素分别为ec1’,ec2’…,ecp’,则:

演化元素e1演化数据依赖于e2,当且仅当(1)存在v∈USE(e1)∩DEF(e2),且e2可达e1,任意e’∈PATH(e2,e1),v∉USE(e’)∩DEF(e2);(2)若e2∈{ec1,ec2,…,ecp},v∈USE(e1)∩DEF(e2’),且e2’可达e1,任意e’∈PATH(e2’,e1),>2’),记作:

上述定义中,演化数据依赖取决于演化后程序元素,演化数据会传播影响其他数据元素,同时,对于演化类型ctC,演化前的程序元素处数据有可能被修改,会影响到相关依赖元素。程序在不断的演化过程中,针对不同的演化方案重新构造依赖关系代价非常大,因此基于源程序及演化元素进行迭代构造。演化数据依赖关系通过演化数据依赖图来表示,图结点表示演化数据元素,边表示结点间存在数据依赖关系。演化数据依赖图的构造步骤如下:

(3-1)初始时,演化元素集E={e1,e2,…,em},演化数据依赖图结点集合EDNode>1,e2,…,em},边集合EDEdge=Φ并创建源程序P的代码分析树ASTree;

(3-2)对于每个E中元素,如果其演化类型为ctC或ctD,定位ei在ASTree相应演化前结点B(ei),对每个ASTree上B(ei)可达结点ej,如果,则EDNode= EDNode∪{ei,ej},EDEdge=EDEdge∪{<ei,ej>};

(3-3)对于每个E中元素,如果其演化类型为ctC或ctA,定位ei在ASTree相应结点,对每个ASTree上ei可达结点ej,如果,则EDNode= EDNode∪{ei,ej},EDEdge=EDEdge∪{<ei,ej>}。

上述步骤中,对于修改结点,不但要记录修改前的结点依赖,还要记录修改后的结点依赖,依赖关系均从同一个结点引出,标记为<ei,ej>;对于删除结点,只要根据修改前分析树构造演化数据依赖;对于新加入结点,则要构造新的分析树结点,并插入到相应父结点下,孩子结点之上,然后构造演化数据依赖。这种构造方法,避免了重复的构造分析树,以提高数据依赖关系的提取。

(4)基于源程序P和演化程序PE,构建演化控制依赖关系,演化控制依赖关系通过演化控制依赖图来表示,图结点表示演化控制元素,边表示结点间存在控制依赖关系。演化控制依赖关系的定义如下:

令演化元素集合E={ec1,ec2,…,ecp}∪{ed1,ed2,…,edq}∪{ea1,ea2,…,ear},其中,eck(k=1,…p)、edl(l=1,…q)、>as(s=1,…r)分别表示演化后修改的元素、演化中删除的元素和演化后新增的元素,其修改类型依次为ctC、ctD、ctA,且ec1,ec2,…,ecp演化前的元素分别为ec1’,ec2’…,ecp’,则:>1演化控制依赖于e2,当且仅当(1)e2为谓词结点,存在PATH(e2,e1),e1∉MUSTPASS(e2),任意e’∈PATH(e2,e1),e1∈MUSTPASS(e’);(2)若e2∈{ec1,ec2,…,ecp},e2’为谓词结点,存在PATH(e2’,e1),e1∉MUSTPASS(e2’),任意e’∈PATH(e2’,e1),e1∈MUSTPASS(e’);,记作:

上述定义中,演化控制依赖关系需满足三个条件:首先,演化前后元素必须是谓词结点;其次,演化前后元素可达另一个元素,且并非必经另一个元素;再次,任何可达路径中的程序元素必经另一元素。第二个条件保证了可达性并且可以根据条件选择执行,第三个条件决定了,是演化元素控制的执行,不是演化元素后面的谓词语句。与演化数据依赖关系类似,演化控制依赖通过演化控制依赖图来实现,图结点表示演化数据元素,边表示结点间存在演化数据依赖关系。基于源程序构造演化程序分析树,其演化控制依赖关系的构造过程如下:

(4-1)′生成演化程序代码分析树ASTree;

(4-2)′若演化类型为ctC,且修改前元素为谓词元素,构建修改前元素的控制依赖关系;如果修改后元素为谓词,更新代码分析树,构建修改后元素的控制依赖关系;

(4-3)′若演化类型为ctD,且删除元素为谓词元素,构建谓词元素的控制依赖关系;

(4-4)′若演化类型为ctA,且添加元素为谓词元素,生成代码分析结点,插入结点到相应代码分析树位置,然后构建演化元素依赖关系;

步骤(4-2)′、(4-3)′和(4-4)′中,如果演化前后元素不是谓词结点,则不存在控制依赖关系,这里算法的关键是一旦确定演化前后元素是谓词结点,如何构造演化控制依赖图。演化元素结点e的演化控制依赖图的步骤如下:

(4-1)初始时,演化元素结点为e,演化分析树为ASTree,演化控制依赖图G为<ECNode,ECEdge>,其中,ECNode为演化影响结点结合,ECEdge是演化控制依赖边集合;

(4-2)如果e的结点类型非谓词结点,转(4-6);

(4-3)在ASTree上对每一个e的可达结点ei,如果ei是e的后必经结点,转(4-6);

(4-4)若e’为e到达ei的路径上的任一结点,且e’不是e的后必经结点,转(4-6);

(4-5)更新演化控制依赖图G,加入演化结点和相应边,即ECNode= ECNode∪{e,ei},ECEdge= ECEdge∪{<ei,ej>};

(4-6)返回演化控制依赖图G。

(5)基于演化切片准则、演化数据依赖图和演化控制依赖图,构建演化切片。演化切片是根据演化元素提取的程序片段,记录了演化元素的影响部分。其定义如下:

令P为源程序,<E,V,CT>为演化切片准则,基于切片准则生成的演化依赖图为G=<EDNode∪ECNode,EDEdge∪ECEdge>,则演化切片ESlice是演化程序元素结点的集合EDNode∪ECNode∪INode,其中,INode是基于EDNode∪ECNode-E生成的间接数据依赖和控制依赖结点结合。

演化切片主要记录了演化元素影响的程序元素,EDNode记录了直接数据影响的元素,ECNode记录了直接控制影响的元素。然而,影响会不断传播,受影响的元素又会影响其他元素,不断迭代,最终生成演化切片。

图3给出了根据演化切片识别出影响元素的简单例子。

图3(a)是一个简单的程序例子,其功能是根据x的值返回不同的表达式结果。图3(b)是例子程序的静态依赖图,细实线结点表示语句或表达式,结点中编号对应图3(a)语句或表达式前编号,实边是数据依赖,虚边是控制依赖。图3(c)是识别出删除结点3之后的依赖图,其中粗实线结点为演化切片元素即演化切片为{6,8}。实际上,由于图3(c)中删除了结点3影响了变量y的定值,从而影响y值的使用。程序中,仅有结点6和8使用了变量y。图3(d)是识别出修改语句3之后的依赖图,演化切片为{5,6,7,8,9,10},语句3的修改了y,x的定值,x的值通过数据传播影响了语句5,8,10,而语句5,8,10进一步控制影响了语句6,7,9,同时语句3中y的值影响了语句6,8的返回值。在实际修改中,如果语句2输入的值就是2,此时实际影响语句仅包含6,8。图3(e)为在识别出语句3后添加了语句x=2,按照前面的算法计算出的演化切片为{5,6,7,8,9,10},但5,6实际上不受添加语句的影响。

三、基于演化切片的演化影响集预测ESISP方法的有效性度量

基于演化切片的演化影响集的有效性主要取决于预测的影响集的精度以及存伪度,通过查全率recall和查准率NPrecision来度量; 而演化识别率从一定程度上影响了精度和存伪度。演化元素的识别通过识别率和误判率进行度量,具体度量方法如下:

式(Ⅰ),

式(Ⅱ),

式(Ⅰ)中,为识别率,为识别出的实际演化元素数目,为所有实际演化元素数目;式(Ⅱ)中,为误判率,为识别出的非实际演化元素数目,为识别出的全部演化数目,即,显然,值越大,识别率越高,元素识别越准确,越有利于演化影响分析的进行;值越大,误判率越高,越影响后续的演化影响分析,理想情况下,==0,即识别率为百分之百,误判率为0,此时识别的元素集合与实际修改的元素集合相同;

式(Ⅲ),

式(Ⅳ),

式(Ⅲ)和(Ⅳ)中,ES是通过计算演化切片获得的预测演化影响集,RI是实际演化影响集,recall值越大,查全率越高,能够正确预测实际演化元素比例越多;当RIES时,recall达到理想值1,表示演化切片能够预测出全部的实际演化元素;Nprecision值越小,表示预测存伪情况越小,当RI=ES时,Nprecision达到理想值0。

下面通过实施例验证本发明的有效性。

1)实例对象

我们选取了四个实验对象源程序实例:Tetris,SimpleJaveApp, NanoXML和JHSA。

前三个对象均为开源程序,后一个对象是一个我们早期开发的JAVA切片程序。上表简单描述了4个实例对象:第一列是对象名称;第二列是对象代码行数;第三列对象程序的演化方案数目,实验各选取了20个演化方案;第四列是对象功能描述。在实际软件演化过程中,演化影响分析技术主要分析软件程序演化后,可能的演化影响部分,开发者和维护者根据分析结果对已有需求及分析结果作出相应决策。

2)度量过程

a) 收集每个修改方案原版本VO、中间版本VM和最终版本Vf;

b) 基于文中演化元素识别方法识别出版本VM中的演化元素;

c) 基于文中演化切片构建方法构建演化切片ESlice;

d) 基于VO和VM计算recogniton_ratio和fault_ratio;

e) 基于ES、VO 、VM与VF计算recall和NPrecision。

3)度量结果

a) 演化元素的识别率和误判率

根据发明中识别方法所得识别率和误判h率如图4和图5所示。在统计识别率时,我们将修改类型进行了分类。在图4中,本方法能识别Tetris,NanoXML的全部修改以及SimpleJavaApp,JHSA的绝大部分修改,部分ctC演化代码未能识别。在图5中,本方法在Tetris,NanoXML中修改代码误判率为0,在SimpleJavaApp,JHSA存在20%左右的ctC修改类型的代码误判。总体上,通过文中的方式可以几乎无误的识别出修改代码。

b) 演化影响元素的查全率和存伪率

识别出修改元素后,根据文中的方法构建演化切片作为预估影响集,然后根据公式(Ⅲ)和(Ⅳ)得出的查全率和存伪率如图6所示。本文的技术查全率保持在较高的水平,Tetris,NanoXML及JHSA的查全率接近100%,SimpleJavaApp的查全率最低; SimpleJavaApp的存伪率最高,随后依次是Tetris、JHSA、NanoXML。

总体上,本发明中的基于演化切片的演化影响集预测ESISP技术具有较高的查全率和较低的存伪率,能有效辅助软件开发人员和维护人员作出相关决策。

以上所述是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明所述原理的前提下,还可以作出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号