一种基于对象传播图和指针分析的函数调用图构建方法与流程

文档序号:34652841发布日期:2023-06-29 21:19阅读:44来源:国知局
一种基于对象传播图和指针分析的函数调用图构建方法与流程

本发明涉及软件分析,尤其涉及一种基于对象传播图和指针分析的函数调用图构建方法。


背景技术:

1、在c++语言中,因为有面向对象多态技术,通过代码静态分析建立函数调用关系图有困难,即需要先知道指针的指向对象类型才能确定真正调用到的方法;指针分析即通过静态分析手段,分析代码程序动态运行过程中指针可能的指向关系的方法,指向关系包括指针所指的对象类型,所指的对象是否同一等信息;此信息对静态分析方法中的很多技术都有影响,更准确的指针分析结果能提升其他依赖指针信息的分析的精度与效率。因为指针指向的对象信息是程序运行期的信息,但静态分析技术是不运行代码的,其通过分析代码静态文本找到代码的相关特征,这意味着指针分析需要一定程度上模拟代码的运行过程,对运行期的动态特征进行一定程度的抽象建模,才能获取和描述指针信息。

2、传统的构造函数调用图处理虚函数调用第一种方法是倾向于简单分析,即简单认为所有的虚函数调用都可达,或者所有的虚函数调用都不可达,但真实的运行情况是只有一个虚函数可达,这会让生成的函数调用图在所以的虚函数调用点都丢失精度;第二种方法是利用传统的指针分析技术进行较精确分析,例如anderson指针分析方法,把全部的指针指向关系转换为约束关系,利用约束求解方法得出指向结果。此方法的时间复杂度为o{n3},在被分析代码量很大的情况下计算量大,耗时较长。

3、需要说明的是,在上述背景技术部分公开的信息只用于加强对本公开的背景的理解,因此可以包括不构成对本领域普通技术人员已知的现有技术的信息。


技术实现思路

1、本发明的目的在于克服现有技术的缺点,提供了一种基于对象传播图和指针分析的函数调用图构建方法,解决了传统的构造函数调用图方法存在的不足。

2、本发明的目的通过以下技术方案来实现:一种基于对象传播图和指针分析的函数调用图构建方法,所述函数调用图构建方法包括:

3、s1、分析程序的源代码,得到从主函数开始的输出为函数间的调用关系图,并对此函数进行分析;

4、s2、获取此函数中的所有创建对象语句,记录为最初始创建的指向关系列表;

5、s3、从上到下依次获取此函数中的赋值语句,描述指针对象的传播关系,构建对象传播图,为赋值的来源方和接收方建立一个有向边,且来源方指向接收方,取出来源方的指向关系表,把来源方的指向关系沿着对象传播图向后传播,直到传播到所有路径上;

6、s4、从上到下依次处理此函数中的对象域为左值的赋值语句,以及对象域为右值的赋值语句,并构建对象传播图,并考虑对象域的指向关系;

7、s5、从上到下依次获取此函数中所有函数调用语句,对于虚函数调用,根据得到调用函数的对象信息,以及面向对象特性取出对应函数,建立调用边,对于非虚函数调用,则直接建立调用边,并把被调函数加入待分析函数列表;

8、s6、此函数分析完毕后,从待分析函数列表中取出第一个函数,并重复步骤s2-s5,直到待分析函数列表中所有函数都分析完毕。

9、所述对象传播图中的节点为c++程序代码中的指针变量名,有向边为指针变量间的赋值关系,每个节点的值为一个对象集合,表明指针变量持有的所有对应集合,且根据赋值语句语义这个对象集合会沿着对象传播图中的边传播。

10、所述构建对象传播图具体包括以下内容:

11、a1、找出代码中所有的指针变量名集合;

12、a2、找出代码中所有的指针变量名赋值语句,并在两个指针变量名之间构建一条对象传播边;

13、a3、把每个指针变量名持有的对象集合沿两个指针变量名之间的传播边进行传播,直到所有路径都被覆盖;

14、a4、当两个指针变量名之间传播存在域指针时,在后向指针变量名指向的对象集合确定后,在分析域指针,每次后向指针变量名指向的对象集合更新后,再创建更新了的对象集合的域指针的传播边,再沿更新的传播边传播对象集合,如果后续传播后存在更新的域指针传播边建立,则继续循环传播,直到没有更新的域指针传播边建立后则停止。

15、在步骤s3到步骤s4的传播过程中,需要把指向信息不断传播知道所有可达传播边传播完毕,同时在传播过程中如果多个指针变量名之间的传播形成传播闭环时,仅把新增的指向关系传播下去即可。

16、在步骤s1中只分析真正可达的函数,因此分析c++程序中通过main函数可达的所有函数列表;为了降低代码运行过程中函数每次被调用时生成的对象不同而增加的计算量,在步骤s2中通过创建对象语句作为所有对象的来源,在代码同一位置用同一对象表示,以快速分析对象之间的传播关系。

17、在步骤s5中处理虚函数调用时,在得到指针指向信息后根据所指对象的类型信息得到真正调用到的虚函数,即可得到指针指向的对象的类型,进而确定真正调用的函数;步骤s6中在待分析函数列表中加入去重逻辑,对已经分析过的同一函数不再进行分析,列表分析完毕后,即所有通过main函数可达的函数完成分析,进而完成代码程序分析。

18、本发明具有以下优点:一种基于对象传播图和指针分析的函数调用图构建方法,基于待分析代码的特性,折中选择处理c++虚函数调用、堆使用(malloc,new等系统调用)、域对象较多使用的情况,减少传统指针分析的计算处理规模,提升分析效率。对重点分析的堆使用采用代码分配点方法建模,域对象采用域敏感的方法建模,提升关键部分的分析精度。此方法为精度和效率的折中,根据待分析代码的特性,部分采用指针分析方法和对关键分析内容进行建模产生较为精确的函数调用关系图。



技术特征:

1.一种基于对象传播图和指针分析的函数调用图构建方法,其特征在于:所述函数调用图构建方法包括:

2.根据权利要求1所述的一种基于对象传播图和指针分析的函数调用图构建方法,其特征在于:所述对象传播图中的节点为c++程序代码中的指针变量名,有向边为指针变量间的赋值关系,每个节点的值为一个对象集合,表明指针变量持有的所有对应集合,且根据赋值语句语义这个对象集合会沿着对象传播图中的边传播。

3.根据权利要求2所述的一种基于对象传播图和指针分析的函数调用图构建方法,其特征在于:所述构建对象传播图具体包括以下内容:

4.根据权利要求3所述的一种基于对象传播图和指针分析的函数调用图构建方法,其特征在于:在步骤s3到步骤s4的传播过程中,需要把指向信息不断传播知道所有可达传播边传播完毕,同时在传播过程中如果多个指针变量名之间的传播形成传播闭环时,仅把新增的指向关系传播下去即可。

5.根据权利要求1所述的一种基于对象传播图和指针分析的函数调用图构建方法,其特征在于:在步骤s1中只分析真正可达的函数,因此分析c++程序中通过main函数可达的所有函数列表;为了降低代码运行过程中函数每次被调用时生成的对象不同而增加的计算量,在步骤s2中通过创建对象语句作为所有对象的来源,在代码同一位置用同一对象表示,以快速分析对象之间的传播关系。

6.根据权利要求1所述的一种基于对象传播图和指针分析的函数调用图构建方法,其特征在于:在步骤s5中处理虚函数调用时,在得到指针指向信息后根据所指对象的类型信息得到真正调用到的虚函数,即可得到指针指向的对象的类型,进而确定真正调用的函数;步骤s6中在待分析函数列表中加入去重逻辑,对已经分析过的同一函数不再进行分析,列表分析完毕后,即所有通过main函数可达的函数完成分析,进而完成代码程序分析。


技术总结
本发明涉及一种基于对象传播图的指针分析的函数调用图构建方法,其一边建立值传播图一边在值传播图上传播对象的流动信息,循环地处理值的流动过程。最后通过每个函数调用指针的对象指向信息,就能建立相对准确的函数调用关系图。本发明基于待分析代码的特性,折中选择处理C++虚函数调用、堆使用(malloc,new等系统调用)、域对象较多使用的情况,减少传统指针分析的计算处理规模,提升分析效率。对重点分析的堆使用采用代码分配点方法建模,域对象采用域敏感的方法建模,提升关键部分的分析精度。此方法为精度和效率的折中,根据待分析代码的特性,部分采用指针分析方法和对关键分析内容进行建模产生较为精确的函数调用关系图。

技术研发人员:朱辉,陈昭宇
受保护的技术使用者:软安科技有限公司
技术研发日:
技术公布日:2024/1/13
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1