基于数据流函数调用路径的变更影响域分析方法及系统的制作方法

文档序号:6648895阅读:368来源:国知局
基于数据流函数调用路径的变更影响域分析方法及系统的制作方法
【专利摘要】本发明公开了一种基于数据流函数调用路径的变更影响域分析方法及系统,所述方法包括:对源代码和变更后的代码中的每个函数进行静态路径分析,获得每个函数对应的局部数据流影响树;分别将源代码和变更后的代码中的所有局部数据流影响树整合为对应的全局数据流影响树;比较源代码和变更后的代码的全局数据流影响树,获得数据流变更影响域。本发明能够有效确定数据流变更影响域,大大减少了系统的冗余路径,提高了测试效率,为开发人员快速处理回归测试中的软件缺陷提供了帮助,为回归测试在数据流方面的发展提供了一种新思路。
【专利说明】基于数据流函数调用路径的变更影响域分析方法及系统

【技术领域】
[0001] 本发明设及软件测试领域,具体地,设及一种基于数据流函数调用路径的变更影 响域分析方法及系统。

【背景技术】
[0002] 回归测试是对之前已测试过、经过修改的程序进行重新测试,W验证该修改没有 引入新的错误或者由于更改而发现之前未发现的错误。计算机程序有很大一部分是数据声 明,数据的变化对软件功能的影响将是巨大的。因此,对数据变更的测试是进行回归测试首 先应该考虑的问题。通常,影响域分析用来确定变更影响范围,影响域可W划分为控制流影 响域、数据流影响域和信息流影响域。控制流只是从控制方面没有办法分析数据,范围比较 小;信息流影响范围广,信息量大,难W准确提取影响数据;数据流分析了带有控制关系的 数据流,其影响范围大,变更影响域相对容易确定。
[0003] 函数调用路径的思想是在每个函数完成单元测试的前提下,将代码分析粒度由语 句扩展到函数。其W函数为基本单位,分析源程序里基于控制流的函数之间的逻辑关系。因 此,本发明提出了一种基于数据流函数调用路径的变更影响域分析方法及系统。


【发明内容】

[0004] 本发明的目的是提供一种基于数据流函数调用路径的变更影响域分析方法及系 统,用于解决代码变更后,如何确定变更影响域的问题。
[0005] 本发明的技术方案包括一种基于数据流函数调用路径的变更影响域分析方法,其 包括:
[0006] 对源代码和变更后的代码中的每个函数进行静态路径分析,获得每个函数对应的 局部数据流影响树;
[0007] 分别将源代码和变更后的代码中的所有局部数据流影响树整合为对应的全局数 据流影响树;W及
[000引 比较源代码和变更后的代码的全局数据流影响树,获得数据流变更影响域。
[0009] 优选地,所述对源代码和变更后的代码中的每个函数进行静态分析,获得每个函 数对应的局部数据流影响树,具体包括;将每个函数作为一个语句块,W语句块为单位进行 静态分析,获得每个语句块对应的局部数据流影响树。
[0010] 优选地,所述语句块包括选择语句块、循环语句块、跳转语句块和/或开关语句 块。
[0011] 优选地,获得选择语句块的局部数据流影响树,具体包括:
[0012] 对于不W else语句块结束的选择语句块,当整个if语句块结束时,需在if语句 块的第一个孩子的兄弟链表中添加一个空的结点;当最后一个else if语句块结束时,将 该语句块同上一层if语句块相连,且在if语句块中连接一个空的兄弟结点;
[0013] 对于W else语句块结束的选择语句块,当else语句块结束时,标识整个if语句 块结束,将else语句块同上一层if语句块相连,再将整个if语句块同其父语句块相连,不 添加空的兄弟结点。
[0014] 优选地,获得循环语句块的局部数据流影响树,具体包括;循环语句块包括for语 句块、while-do语句块和do-while语句块,对于for语句块和while-do语句块,当整个语 句块结束时,为该语句块添加一个空的兄弟结点,对于do-while语句块,不需要添加空的 兄弟结点。
[0015] 优选地,获得跳转语句块的局部数据流影响树,具体包括;跳转语句块包括break 语句块、continue语句块和re化rn语句块,若函数名为break语句块、continue语句块或 re化rn语句块,则对应的结点不进行连接操作,若一个循环语句块或switch整个语句块结 束,要从该语句块中删除函数名为break和continue的结点,若一个函数语句块结束,从该 语句块中删除函数名为re化rn的结点。
[0016] 优选地,获得开关语句块的局部数据流影响树,具体包括;所述开关语句块包括 switch语句块和case语句块,当一个case语句块结束时,将当前case语句块同其父语句 块进行兄弟连接操作,当父语句块没有break关键字,则将当前语句块同父语句块进行孩 子连接操作;当整个switch语句块结束时,删除switch语句块中的函数名为break的结 点。
[0017] 优选地,将源局部数据流影响树整合为全局数据流影响树,具体包括;基于每个函 数的第一层数据流影响树,对main函数的局部数据流影响树进行扩展,获得全局数据流影 响树。
[001引优选地,所述比较源代码和变更后的代码的全局数据流影响树,获得数据流变更 影响域,具体包括;确定变更后的代码相对于源代码的变更点,分析变更点时,建立变更影 响模型,将要分析的全局数据流影响树进行对比分析,并将变更点后面的数据流分别标记, 并将标记的节点读取出来得到数据流变更影响域。
[0019] 本发明的技术方案还包括一种基于数据流函数调用路径的变更影响域分析系统, 包括:
[0020] 局部数据流影响树获取模块,用于对源代码和变更后的代码中的每个函数进行静 态路径分析,获得每个函数对应的局部数据流影响树;
[0021] 全局数据流影响树获取模块,用于分别将源代码和变更后的代码中的所有局部数 据流影响树整合为对应的全局数据流影响树;W及
[0022] 变更影响域获取模块,用于比较源代码和变更后的代码的全局数据流影响树,获 得数据流变更影响域。
[0023] 本发明的有益效果是:本发明能够有效确定数据流变更影响域,大大减少了系统 的冗余路径,提高了测试效率,为开发人员快速处理回归测试中的软件缺陷提供了帮助,为 回归测试在数据流方面的发展提供了一种新思路。

【专利附图】

【附图说明】
[0024] 图1是基于数据流函数调用路径的变更影响域分析方法的流程示意图;
[0025] 图2是基于数据流函数调用路径的变更影响域分析方法的实施过程示意图;
[0026] 图3是选择语句块中示例代码的局部数据流影响树示意图;
[0027] 图4是基于数据流函数调用路径的变更影响域分析方法的结构示意图;
[002引图5是应用例中main函数的局部数据流影响树的示意图;
[0029] 图6是应用例中b化nc函数的局部数据流影响树的示意图;
[0030] 图7是应用例中源代码的全局数据流影响树的示意图;
[0031] 图8是应用例中变更后的代码的全局数据流影响树的示意图;
[0032] 图9是应用例中函数数据流变更影响域的示意图。

【具体实施方式】
[0033] W下结合附图对本发明的【具体实施方式】进行详细说明。应当理解的是,此处所描 述的【具体实施方式】仅用于说明和解释本发明,并不用于限制本发明。
[0034] 为便于描述,本实施方式首先给出了部分术语的定义,其仅用于对技术方案进行 解释,并不限定本发明的保护范围。
[0035] 1、函数调用路径(化nction化lling Path, FCP);指根据函数调用关系得到的由 程序入口点到出口点的一个函数名序列,表示为path; = {f 1。,fU,f 12……f J。其中,fu表 示函数名,fu与f u+i之间的相邻关系表示f u调用了 f u+i或f u与f u+i顺序执行。
[0036] 2、数据流函数调用路径;数据流函数调用路径指同一数据与所关联的函数之间的 序列,使用P表示,Pi= { (V VV。,…叫k/V化…,nv%m}。其中叫n代表起始数据,V 代表被 调函数,路径中相邻结点表示调用关系或者顺序执行关系。例如Pi= {(Va,I%mi)}表示源 函数中的数据流函数调用关路径V。一 m。一 m 1。
[0037] 3、局部数据流影响树;局部数据流影响树表示源程序中单个函数中所发生的数据 流调用。本实施方式中使用S元组T(M,R,巧表示局部数据流影响树,M表示数据集合,R表 示数据流之间的调用关系,S表示源函数。
[003引 4、静态路径;是指对源代码进行静态分析,根据数据流调用关系得到的数据流调 用路径。全局静态路径集是全部静态路径的集合,表示为;B化C)=巧1 A,…口。},其中S 是源代码,C是数据流调用关系准则,Pi是数据流调用路径。
[0039] 5、语句块:是指过程语言中特定程序结构,由关键字构成的一个语句序列,或不在 特定程序结构中的单条语句。
[0040] 基于上述定义,本实施方式给出了一种基于数据流函数调用路径的变更影响域分 析方法,如图1所示,包括W下步骤:
[0041] 步骤1,对源代码和变更后的代码中的每个函数进行静态路径分析,获得每个函数 对应的局部数据流影响树。
[0042] 步骤2,分别将源代码和变更后的代码中的所有局部数据流影响树整合为对应的 全局数据流影响树。
[0043] 步骤3,比较源代码和变更后的代码的全局数据流影响树,获得数据流变更影响 域。
[0044] 上述S个步骤仅示意了一种优选的执行顺序,本发明并不限制于此。
[0045] 如图2所示,本实施例方式的大致实施过程为:对源代码和变更后代码通过局部 数据处理得到局部数据流影响树,然后通过全局数据流影响树获取算法得到全局数据流影 响树,将分别得到的全局数据流影响树使用变更影响模型算法得到数据流影响域分析报 告。因此,基于上述=个步骤,具体的实施过程如下所述。
[0046] 一、语句块及各语句块的局部数据流影响树
[0047] 本实施方式中,所述对源代码和变更后的代码中的每个函数进行静态分析,获得 每个函数对应的局部数据流影响树,具体包括;将每个函数作为一个语句块,W语句块为单 位进行静态分析,获得每个语句块对应的局部数据流影响树。
[0048] 首先,进行语句块分析。
[0049] 所述语句块包括选择语句块、循环语句块、跳转语句块和/或开关语句块。
[0050] (1)选择语句块
[0化1] 选择语句块包括if语句块、else语句块和else if语句块,针对该种结构可W分 为两类:
[0052] 1) if、if/else if/…/else if
[0化3] 不W else语句块结束,当整个if语句块结束时,需在if语句块的第一个孩子的 兄弟链表中添加一个空的结点,W下面所示的代码为例,其对应的局部数据流影响树如图3 所示。
[0054] 示例代码;
[0055] if (i>3)
[0化6] tVari 油 le++ ;
[0057] else if(i<4)
[0化引 tVari 油 le-;
[0化9] 上述示例代码中,当最后一个else if语句块结束时,将其语句块对应的树同上一 层if语句块相连,由于else if语句块结束标识整个if语句块结束,因此,还需要在if语 句块树中连接一个空的兄弟结点。
[0060] 2) if/…/else
[0061] W else语句块结束,当语句块else结束时,标识整个if语句块结束,将else语 句块同上一层if语句块相连,最后将整个if语句块同其父语句块相连,没有必要再添加一 个空的兄弟结点。
[0062] (2)循环语句块
[0063] 循环语句块包括for语句块、while-do语句块和do-while语句块,采用Z路径测 试思想处理,只考虑循环的两个可能性;重复零次和多于零次的重复。因此,在处理for语 句块和while-do语句块结构类似于处理if/'''/else if结构。当整个语句块结束时,需为 其添加一个空的兄弟结点。
[0064] do-while结构由于该循环至少被执行了一次,因此,不需要为其添加空的兄弟结 点。
[0065] 做固龄语句块
[0066] 跳转语句块包括break语句块、continue语句块和re化rn语句块,break语句块 主要出现在循环、switch/case结构中,continue语句块主要出现在循环结构中,return语 句块可W出现在任何语句块中。在程序处理过程中,W上关键字均被识为函数名处理,在W 下情况中要对局部数据流影响树进行特殊处理。
[0067] 1)当进行语句块连接处理时,如果函数名为W上关键字,那么该结点不进行连接 操作。
[0068] 2)当一个循环语句块、switch整个语句块结束时,要从语句块中删除函数名为 break、continue 的结点。
[0069] 3)当一个函数语句块结束时,从函数语句块树中删除函数名为re化rn的结点。
[0070] (4)开关语句块
[0071] 开关语句块包括switch语句块和case语句块,在处理case语句块时,case语句 块之间通过break关键字来实现并列关系,因此,当一个case语句块结束时,要进行W下两 步操作;将当前case语句块同其父语句块进行兄弟连接操作,case语句块本身就存在并列 关系;当父语句块没有break关键字,将当前语句块同父语句块进行孩子连接操作。
[0072] 当整个switch语句块结束时,删除switch中函数名为break的结点。
[0073] 其次,采用局部数据处理算法获取局部数据流影响树。
[0074] 在分析函数时,首先建立队列,设置临时变量,遇到语句块、遇到测试变量加 1,并将数值加入队列中,如果是控制字则将其入队,遇到含有所测数据的函数名和数据时 都要入队,在遇到临时变量减1并入队,通过两端对临时变量数值的比较得到数据流函 数调用关系,最后得到局部数据流调用关系队列。
[0075] 从分析得到的队列来建立局部数据流影响树,队列出队,创建一个树头,如果是数 字将其存储到变量中,如果是控制字,根据控制字的不同类别来进行结构的选择,遇到数据 流则添加数据流信息到孩子节点,按此下去,直到队列出队完,得到局部数据流函数影响树
[0076] 局部数据处理算法的算法实现描述如下:
[0077] 输入;源程序,变更后程序 [007引输出;局部数据流函数影响树
[0079] BEGIN //对函数F进行 ForF. lines<-0 If F. lines, contains ("{',) xragTemp<-xra呂Terap+1 dataQueue. insertQue(xragTerap) if F. lines, contains (keyWords) dataQueue. insertQue(keyWords)
[0080]

【权利要求】
1. 一种基于数据流函数调用路径的变更影响域分析方法,其特征在于,包括: 对源代码和变更后的代码中的每个函数进行静态路径分析,获得每个函数对应的局部 数据流影响树; 分别将源代码和变更后的代码中的所有局部数据流影响树整合为对应的全局数据流 影响树;以及 比较源代码和变更后的代码的全局数据流影响树,获得数据流变更影响域。
2. 根据权利要求1所述的变更影响域分析方法,其特征在于,所述对源代码和变更后 的代码中的每个函数进行静态分析,获得每个函数对应的局部数据流影响树,具体包括:将 每个函数作为一个语句块,以语句块为单位进行静态分析,获得每个语句块对应的局部数 据流影响树。
3. 根据权利要求2所述的变更影响域分析方法,其特征在于,所述语句块包括选择语 句块、循环语句块、跳转语句块和/或开关语句块。
4. 根据权利要求3所述的变更影响域分析方法,其特征在于,获得选择语句块的局部 数据流影响树,具体包括: 对于不以else语句块结束的选择语句块,当整个if语句块结束时,需在if语句块的 第一个孩子结点的兄弟链表中添加一个空的结点;当最后一个else if语句块结束时,将 该语句块同上一层if语句块相连,且在if语句块中连接一个空的兄弟结点; 对于以else语句块结束的选择语句块,当else语句块结束时,标识整个if语句块结 束,将else语句块同上一层if语句块相连,再将整个if语句块同其父语句块相连,不添加 空的兄弟结点。
5. 根据权利要求3所述的变更影响域分析方法,其特征在于,获得循环语句块的局部 数据流影响树,具体包括:循环语句块包括for语句块、while-do语句块和do-while语句 块,对于for语句块和while-do语句块,当整个语句块结束时,为该语句块添加一个空的兄 弟结点,对于do-while语句块,不需要添加空的兄弟结点。
6. 根据权利要求3所述的变更影响域分析方法,其特征在于,获得跳转语句块的局部 数据流影响树,具体包括:跳转语句块包括break语句块、continue语句块和return语句 块,若函数名为break语句块、continue语句块或return语句块,则对应的结点不进行连接 操作,若一个循环语句块或switch整个语句块结束,要从该语句块中删除函数名为break 和continue的结点,若一个函数语句块结束,从该语句块中删除函数名为return的结点。
7. 根据权利要求3所述的变更影响域分析方法,其特征在于,获得开关语句块的局 部数据流影响树,具体包括:所述开关语句块包括switch语句块和case语句块,当一个 case语句块结束时,将当前case语句块同其父语句块进行兄弟连接操作,当父语句块没有 break关键字,则将当前语句块同父语句块进行孩子连接操作;当整个switch语句块结束 时,删除switch语句块中的函数名为break的结点。
8. 根据权利要求1所述的变更影响域分析方法,其特征在于,将源局部数据流影响树 整合为全局数据流影响树具体包括:基于每个函数的第一层数据流影响树,对main函数的 局部数据流影响树进行扩展,获得全局数据流影响树。
9. 根据权利要求1所述的变更影响域分析方法,其特征在于,所述比较源代码和变更 后的代码的全局数据流影响树,获得数据流变更影响域,具体包括:确定变更后的代码相对 于源代码的变更点,分析变更点时,建立变更影响模型,将要分析的全局数据流影响树进行 对比分析,并将变更点后面的数据流分别标记,并将标记的节点读取出来得到数据流变更 影响域。
10. -种基于数据流函数调用路径的变更影响域分析系统,其特征在于,包括: 局部数据流影响树获取模块,用于对源代码和变更后的代码中的每个函数进行静态路 径分析,获得每个函数对应的局部数据流影响树; 全局数据流影响树获取模块,用于分别将源代码和变更后的代码中的所有局部数据流 影响树整合为对应的全局数据流影响树;以及 变更影响域获取模块,用于比较源代码和变更后的代码的全局数据流影响树,获得数 据流变更影响域。
【文档编号】G06F11/36GK104503917SQ201510004022
【公开日】2015年4月8日 申请日期:2015年1月4日 优先权日:2015年1月4日
【发明者】牟永敏 申请人:牟永敏, 北京信息科技大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1