发明名称 一种基于cfg文件静态分析C++虚函数调用的方法
摘要 本发明公开了一种基于cfg文件静态分析C++虚函数调用的方法,其特征是:首先建立多个类的新虚函数链表和多个类的虚函数起始位置偏移链表,其次虚函数调用时,根据类类型指针的动态类型和静态类型信息,通过新虚函数链表和虚函数起始位置偏移链表返回被调用的虚函数名称,结合虚函数调用时参数,唯一确定被调用的虚函数。通过使用编译器中间文件class文件,建立与编译器建表规则一致的新虚函数链表等,通过记录类类型指针的静态类型和动态类型,结合建立的新虚函数链表等,实现静态分析时准确获取动态运行时信息,准确确定被调用的虚函数,从而提高了静态分析精确性,更加符合程序逻辑。
申请公布号 CN104331368A 申请公布日期 2015.02.04
申请号 CN201410658925.5 申请日期 2014.11.18
申请人 合肥康捷信息科技有限公司 发明人 顾乃杰;冯光辉;张明;曹华雄
分类号 G06F11/36(2006.01)I;G06F9/45(2006.01)I 主分类号 G06F11/36(2006.01)I
代理机构 安徽省合肥新安专利代理有限责任公司 34101 代理人 何梅生
主权项 一种基于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‑>n um)(pointer)”标识虚函数调用,通过pointer指针调用虚函数时,根据所述pointer指针的动态类型,从所述建立的多个类的新虚函数链表和多个类的虚函数起始位置偏移链表中,选择poi nter指针动态类型对应的新虚函数链表和虚函数起始位置偏移链表;步骤2.2、对虚函数起始位置偏移链表进行遍历并找到一节点,所述节点中存放了对应poi nter指针静态类型的起始位置偏移信息,所述起始偏移位置使用指向新虚函数链表节点的指针进行表示,通过所述指针找到新虚函数链表中的相应节点作为查找起始节点;步骤2.3、根据所述cfg文件中pointer指针调用虚函数格式中的num整数,从所述查找起始节点开始查找第num个链表节点,且查找起始节点为第0个链表节点,并返回第num个节点中存储的虚函数名称;步骤2.4、通过cfg文件中虚函数调用中的parameter虚函数参数列表,使用C++中重载规则,唯一确定被调用的虚函数,从而完成虚函数调用解析。
地址 230000 安徽省合肥市望江西路和创新大道交叉口中国科学技术大学先进技术研究院综合大楼A526