一种基于控制流图的函数调用路径提取方法及装置的制造方法

文档序号:9417169阅读:413来源:国知局
一种基于控制流图的函数调用路径提取方法及装置的制造方法
【技术领域】
[0001] 本发明涉及软件测试技术领域,具体地,涉及一种基于控制流图的函数调用路径 提取方法及装置。
【背景技术】
[0002] 函数调用路径是一个由程序入口点到出口点的函数名序列,其将控制逻辑与函数 调用相结合,并把代码分析粒度从语句扩展到函数。
[0003] -个程序会因为含有判定条件的选择语句和控制语句而产生多条函数调用路径。 在程序设计中,源代码中有顺序、选择、循环三种语句结构。顺序语句不增加函数调用路径 的条数,只有选择语句和循环语句才可能产生更多的程序分支。以C语言为例,关键字if, for,while,switch将会产生多条执行语句。所以,这些能够产生分支的关键字是提取函数 调用关系图的关注点。
[0004] 目前,提取函数调用路径的方法主要分为两种,一种是通过静态分析工具分析源 代码,提取程序中的方法调用和模块之间的交互信息,确定模块之间的控制流的转向,使用 自动机或者其他手段建立函数调用关系图,进而提取函数调用路径。静态分析是指在不需 要执行源代码的条件下对源代码进行分析,与动态分析是相对的,动态分析是在执行源代 码的条件下对源代码进行分析。
[0005] 另一种更直观地提取函数调用路径的方法是程序插装法,即通过在源代码或汇编 代码中插入设计好的探针函数,在程序再次执行时,即可收集到进入函数以及退出函数的 插装信息,基于这些插装信息,可以获得程序的控制流的等信息,进而提取函数调用路径。 其中,可以使用装点流拆分算法或其他算法实现函数调用路径的提取工作。目前,在软件自 动化测试领域中,目标代码插装和源代码插装是主流的插装研究技术,但是动态插装方法 的完整性依赖于测试用例的选取,如果测试用例选取不全,会导致测试过程不充分。
[0006] 因此,在现有技术中提取函数调用路径的方法的基础上,为了保证函数调用路径 提取的准确性以及简化函数调用路径的分析过程,提出新的提取函数调用路径的方案是非 常有必要的。

【发明内容】

[0007] 本发明所要解决的技术问题是提供一种基于控制流图的函数调用路径提取方法 及装置,其目的在于使函数调用路径的提取更为简单准确。
[0008] 本发明解决上述技术问题的技术方案如下:一种基于控制流图的函数调用路径提 取方法,包括:对源代码进行处理,获得包含控制流消息的中间代码;将所述中间代码转换 为控制流图,并将函数调用保留在所述控制流图的节点中;根据所述控制流图中每一个节 点包含的函数调用的个数的对控制流图进行处理,将控制流图转换成函数调用关系图;以 及根据所述函数调用关系图提取出函数调用路径。
[0009] 优选地,所述对源代码进行处理,获得包含控制流消息的中间代码,包括:基于 gcc编译器对源代码进行处理,获得包含控制流消息的GCC-GFG中间代码。
[0010] 优选地,将所述中间代码转换为控制流图,包括:采用pattern-action模式对所 述中间代码进行静态分析,将所述中间代码转换为控制流图;其中,pattern-action模式 中的pattern是指采用规则匹配,action是指当匹配到指定规则的代码串后,执行该代码 串的相关动作。
[0011] 优选地,所述规则匹配包括函数声明匹配、基本代码块匹配、goto语句匹配和函数 调用匹配。
[0012] 优选地,所述根据所述控制流图中每一个节点包含的函数调用的个数的对控制流 图进行处理,将控制流图转换成函数调用关系图,包括:对所述控制流图中每一个节点包含 的函数调用的个数进行分类,分为没有函数调用、函数调用个数仅有一个和函数调用个数 大于一个;对于没有函数调用的节点,删除该节点或者将该节点与其上层节点或下层节点 进行合并;对于函数调用个数仅有一个的节点,将该节点名称重命名为函数名称;对于函 数调用个数大于一个的节点,为该节点的每个函数调用创建一个新节点,并按顺序连接创 建的新节点,再删除该节点,并使该节点的上层节点指向按顺序连接的新节点中的第一个 节点,而按顺序连接的新节点中最后一个节点则指向该节点的下层节点;以及根据对没有 函数调用的节点、函数调用个数仅有一个的节点和函数调用个数大于一个的节点的处理结 果,基于选定的数据结构将控制流图转换成函数调用关系图。
[0013] 本发明的技术方案还提供了一种基于控制流图的函数调用路径提取装置,包括: 中间代码获取模块,用于对源代码进行处理,获得包含控制流消息的中间代码;控制流图获 取模块,用于将所述中间代码转换为控制流图,并将函数调用保留在所述控制流图的节点 中;函数调用关系图获取模块,用于根据所述控制流图中每一个节点包含的函数调用的个 数的对控制流图进行处理,将控制流图转换成函数调用关系图;以及函数调用路径获取模 块,用于根据所述函数调用关系图提取出函数调用路径。
[0014] 优选地,所述对中间代码获取模块中包括gcc编译器模块,其用于对源代码进行 处理,获得包含控制流消息的GCC-GFG中间代码。
[0015] 优选地,所述控制流程图获取模块将所述中间代码转换为控制流图,具体包括:采 用pattern-action模式对所述中间代码进行静态分析,将所述中间代码转换为控制流图; 其中,pattern-action模式中的pattern是指采用规则匹配,action是指当匹配到指定规 则的代码串后,执行该代码串的相关动作。
[0016] 优选地,所述规则匹配包括函数声明匹配、基本代码块匹配、goto语句匹配和函数 调用匹配。
[0017] 优选地,所述函数调用关系图获取模块包括:
[0018] 分类模块,用于对所述控制流图中每一个节点包含的函数调用的个数进行分类, 分为没有函数调用、函数调用个数仅有一个和函数调用个数大于一个;
[0019] 处理模块,用于根据所述分类模块的分析结果对各节点进行处理,包括:
[0020] 对于没有函数调用的节点,删除该节点或者将该节点与其上层节点或下层节点进 行合并;
[0021] 对于函数调用个数仅有一个的节点,将该节点名称重命名为函数名称;
[0022] 对于函数调用个数大于一个的节点,为该节点的每个函数调用创建一个新节点, 并按顺序连接创建的新节点,再删除该节点,并使该节点的上层节点指向按顺序连接的新 节点中的第一个节点,而按顺序连接的新节点中最后一个节点则指向该节点的下层节点; 以及
[0023] 转换模块,用于根据所述处理模块的处理结果,基于选定的数据结构将控制流图 转换成函数调用关系图。
[0024] 本发明的有益效果是:本发明可以简化函数调用路径的分析过程,并且更容易获 取准确的函数调用路径。
[0025] 本发明的其他优点和有益效果将在【具体实施方式】中进一步说明。
【附图说明】
[0026] 图1为本发明实施例中基于控制流图的函数调用路径提取方法的流程示意图;
[0027] 图2为本发明实施例中包含if语句的分析示例的示意图;
[0028] 图3为本发明实施例中if条件语句执行完成后直接return的分析示例的示意 图;
[0029] 图4为本发明实施例中包含for语句的分析示例的示意图;
[0030] 图5为本发明实施例中使用while循环实现与图4相同功能的分析示例的示意 图;
[0031] 图6为本发明实施例中根据规则P1-P6提取函数控制流图的流程示意图;
[0032] 图7为本发明实施例中将控制流图转换成函数调用关系图的流程示意图;
[0033] 图8(a)-图8(d)为本发明实施例中无函数调用的节点的四种情况的示意图;
[0034] 图9为本发明实施例中控制流图的数据存储格式的示意图;
[0035] 图10为本发明实施例中基于控制流图的函数调用路径提取装置的流程示意图;
[0036] 图11为本发明实施例中应用例一的选择循环嵌套函数的代码分析过程的示意 图;
[0037] 图12为本发明实施例中应用例一的控制流图与函数调用图的比较示意图;
[0038] 图13(a)-图13(b)为本发明实施例中应用例二的含三目运算符递归函数示例代 码分析过程的示意图;
[0039] 图14(a)-图14(d)分别为本发明实施例中应用例二的mai
当前第1页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1