Anderson算法,时间复杂到是立方级别。
一种有趣的替代方案是 Steensgaard 算法[Ste96],它通过将赋值视为双向的方式执行更粗粒度的分析。该分析可以通过“**术语统一(term unification)**”来优雅地表示;因此,它被称为**基于统一**的指向分析。我们为每个抽象单元 c 使用术语变量 [[c]],并使用term构造函数 $\\uparrow t$ 表示指向 t 的指针。(与第11.2节相比,请注意符号的变化:在这里,[[c]] 是一个term变量,不直接表示一组抽象单元。)
那么对于指针相关的操作,我们进行如下表示:
请注意,对于每个指针操作,最多构造两个统一约束。(这与Andersen的分析不同,Andersen的分析中最后两种语句对每个抽象单元都需要一个约束。)具有一般性,term构造函数满足term等价性:
对于最后得到的指向关系函数,我们定义为:也就是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
Andersen的结果:
Steensgaard的约束:
Steensgaard的结果:利用统一算法(平方复杂度),这个算法永远不会失败,因为只有一个term的构造情况
这个结果显然比Andersen结果要不精确,但是算法更快!