一种指向分析的方法,称为Andersen算法[And94]或基于包含关系的指向分析,与控制流分析非常相似。对于每个抽象单元 c,我们引入一个约束变量 [[c]],来表示c可能涵盖的抽象单元的集合。

    分析需要将程序标准化,使得程序中指针的操作都是如下六种中的一种:

对于每一种操作,按照如下规则生成约束:

Untitled

对于最后两个约束,我们需要考虑每一个Cells里面的元素c,但是对于程序中的变量X的单元,如果没有出现过&X,那么可以跳过。(这个原因是因为最后两个是引用相关的行为,没有&X出现,那么必然不会相关。)空指针的赋值被忽略,因为相当于引入了空集合是[[X]]的子集。上述约束可以发现,这些约束符合第10.2节中立方算法的要求。最后计算的得到的指向函数简单地定义为 pt(p) = [[p]]。

例子:

1 p = alloc null; // p->alloc 1
2 x = y; // x = y
3 x = z; // p->alloc 1; x = z
4 *p = z; // p->alloc 1; x = z; alloc 1 -> z
5 p = q; // x = z; alloc 1 -> z; p = q
6 q = &y; // x = z; alloc 1 -> z; p = q -> y
7 x = *p; // x = y(注意这里p的结果有y,但是y没有指向,所以x是空); alloc 1 -> z; p=q -> y
8 p = &z; // x = y; alloc 1 -> z; q -> y; p -> z

例子右侧,我们补充了每一行的时候,指向关系;不难看出xyz不是指针,p指向alloc1、y、z;q指向y

根据Andersen算法,我们可以生成如下约束:

Untitled

其中Cells={p,q,x,y,z,alloc-1} (这里面如果不能理解pqxyz,可以认为这些变量都预先声明过,才开始使用)。指向关系的最小结果十分简单:

Untitled

请注意,尽管这个算法是无流敏感的,但包含关系约束的方向性意味着数据流仍然以一定的准确性建模。