[发明专利]一种基于cfg文件静态分析C++虚函数调用的方法有效
申请号: | 201410658925.5 | 申请日: | 2014-11-18 |
公开(公告)号: | CN104331368A | 公开(公告)日: | 2015-02-04 |
发明(设计)人: | 顾乃杰;冯光辉;张明;曹华雄 | 申请(专利权)人: | 合肥康捷信息科技有限公司 |
主分类号: | G06F11/36 | 分类号: | G06F11/36;G06F9/45 |
代理公司: | 安徽省合肥新安专利代理有限责任公司 34101 | 代理人: | 何梅生 |
地址: | 230000 安徽省合肥市望江西路和创新大*** | 国省代码: | 安徽;34 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 基于 cfg 文件 静态 分析 c++ 函数 调用 方法 | ||
技术领域
本发明涉及软件分析领域,具体地说是一种基于cfg文件静态分析C++虚函数调用的方法。
背景技术
随着时代的进步,软件的功能越来越复杂,用户对软件的要求也越来越高。同时伴随着计算机相关技术的发展,软件规模越来越庞大,开发的复杂性急剧增加。
随着软件规模的增大,为了保证软件质量,对测试提出了更大的挑战。尤其对于应用于实时性控制等特殊应用场景时,软件发生故障时将会导致不可估量的后果,对软件可靠性要求更高。为了最大程度保证软件可靠性,需要大量测试软件。
在软件测试中,可以分动态测试为和静态测试,前者通过实际运行被测试程序,观察运行结果与预期差异,后者无需程序运行,通过代码分析确定程序缺陷。随着软件代码规模的增大,运行空间急剧扩大,动态测试很难达到100%覆盖率,为软件健壮性和安全性留下隐患,同时随着测试覆盖程度的增加,测试成本也在急剧增加。通过静态分析程序,例如分析程序结构,分析程序函数调用关系,分析程序逻辑,可以更有效发现程序问题,效率通常高于动态测试。
在软件编码中,大量代码使用C++语言开发。在静态分析C++源程序时,通常需要获取函数调用路径,基于函数调用路径分析程序。源程序中存在多个函数调用路径,通过分析每个函数调用路径,进而发现程序中的问题。
发明内容
本发明提出一种具有可操作性的基于cfg文件静态分析C++虚函数调用的方法,以期在静态分析中准确获取动态运行时信息,提高静态分析准确性,实现静态分析更加符合程序语义。
本发明为解决技术问题采用如下技术方案:
本发明一种基于cfg文件静态分析C++虚函数调用的方法,基于Linux平台G++编译器实现,其特点是按如下步骤进行:
步骤1、建立多个类的新虚函数链表和多个类的虚函数起始位置偏移链表:
步骤1.1、利用所述G++编译器对C++源程序进行编译时,添加编译参数fdump-tree-cfg和编译参数fdump-class-hierarchy后进行编译,由所述编译参数fdump-tree-cfg生成cfg文件,由所述编译参数fdump-class-hierarchy获得编译器生成的多个类的虚函数表,并保存在class文件中;所述class文件中包括被G++编译器改编的虚函数名称;
步骤1.2、提取所述class文件中的多个类的虚函数表,并把被G++编译器改编的虚函数名称恢复为C++源程序中的虚函数名称,按虚函数在class文件中出现的顺序使用链表按序进行存储,链表中每个节点对应编译器生成的虚函数表中一行,从而建立多个类的新虚函数链表,所述新虚函数链表中存储的函数名称与源程序中虚函数名称一致;当一个类含有基类时,所述编译器生成的虚函数表和新虚函数链表中包括被直接继承和重写的基类虚函数以及派生类自有虚函数;将所述被直接继承或重写的基类虚函数定义为基类对应的虚函数;
步骤1.3、在所述class文件中编译器生成的虚函数表中,编译器选择一行开始存放所述基类对应虚函数;提取并使用链表记录所述基类对应虚函数在新虚函数链表的中起始存放位置,从而建立类的虚函数起始位置偏移链表;所述虚函数起始位置偏移链表中每个节点存储基类对应虚函数和派生类的首个虚函数在派生类的虚函数表中起始偏移位置;所述起始偏移位置使用指向类的新虚函数链表节点的指针表示;
步骤2、虚函数调用:
步骤2.1、在cfg文件中,以“OBJ_TYPE_REF(other;pointer->num)(pointer,parameter)”格式表示虚函数调用,other为无需处理的字符,pointer为类类型的指针变量名称,num为一整数,parameter为虚函数参数列表,当虚函数无参数时,以“OBJ_TYPE_REF(other;pointer->num)(pointer)”标识虚函数调用,通过pointer指针调用虚函数时,根据所述pointer指针的动态类型,从所述建立的多个类的新虚函数链表和多个类的虚函数起始位置偏移链表中,选择pointer指针动态类型对应的新虚函数链表和虚函数起始位置偏移链表;
步骤2.2、对虚函数起始位置偏移链表进行遍历并找到一节点,所述节点中存放了对应pointer指针静态类型的起始位置偏移信息,所述起始偏移位置使用指向新虚函数链表节点的指针进行表示,通过所述指针找到新虚函数链表中的相应节点作为查找起始节点;
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于合肥康捷信息科技有限公司,未经合肥康捷信息科技有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201410658925.5/2.html,转载请声明来源钻瓜专利网。
- 上一篇:变牙型防松螺母
- 下一篇:带有行程限位装置的气液增压器