如果函数和指针都可以作为变量的编程语言,函数可能会存储在堆上(也就是指针指向一个函数),那么这会让控制流分析变得困难(因为有指针,所以需要先处理好指向关系!)。但是,对于分析过程间的指向关系,没有控制流分析的结果,同样不精确。例如,如下程序中函数调用是通过一个函数变量的指针解引用,同时将指针作为了参数:

(*x)(x) // x是指向函数的指针

为了解决这种“鸡生蛋还是蛋生鸡”的问题,需要将指针分析和控制流分析同时进行。

    对于上述问题的我们需要融合两种算法,我们假设所有的函数调用都标准化的表示为:

$$ X = X_0(X_1,~\dots,~X_n); $$

其中所有的表达式都是变量。相似的所有的返回表达式都假定为变量,表示为 return X;

Andersen算法同控制流分析很相似,可以很容易的扩展恰当的约束来支持控制流分析。对于常量函数f的引用,我们产生如下约束:

$$ f \in [[f]] $$

函数调用的计算产生如下约束:这个需要对于所有具有n个参数的函数定义都生成

Untitled

Untitled