本文主要参考Pointer Analysis
啥是指针分析
这里要区分指针分析(Pointer Analysis)和别名分析(Alias Analysis),指针分析也是别名分析的基础。
- 指针分析:分析指针所有可能指向的对象。
- 别名分析:分析两个指针是否指向相同的对象,可通过指针分析来推导得到。
int x;
int* p = &x;
int* q = p;
指针分析可以得到p和q指向x,进一步*p、*q和x互为别名。
为啥要指针分析
指针的应用非常广泛,看几个例子。
CASE1:
*p = a + b;
y = a + b;
在可用表达式分析中,p若指向a或者b,则第二个a+b则不是冗余的。
CASE2:
x = 3; *p = 4; y = x;
常量传播分析中,y是否是常量取决于p的指向。
如何进行指针分析
指针分析是一类特殊的数据流问题,它是其它静态程序分析的基础,但指针使用的灵活性导致了指针分析的复杂性,实际上指针分析是一个不可判定问题,所以实际的指针分析算法都是近似且保守的,须在效率和精度之间进行折衷。
指针分析研究的内容主要集中在分析精度和时空开销之间的取舍,精度方面,主要指流敏感性(flow-sensitivity)和上下文敏感性(context-sensitivity),一般而言,流敏感分析方法的精度明显好于流不敏感的分析方法,在上下文敏感性上也有同样的特点。流不敏感的指针分析普遍使用在开源或者产品级高级编译器中,其中主要有两类:基于包含(inclusion-based)的指针分析和基于合并(unification-based)的指针分析。
基于包含的指针分析是一种基于约束集(constraint set)求解的流不敏感的指针分析方法,该指针分析又称为基于子集(subset-based)的指针分析或者基于约束的(constraint-based)的指针分析,在指针分析领域后来也被称之为Anderson风格的指针分析。其算法的时间复杂度为O(n3)。
注:上述内容引用自《陈聪明, 霍玮, 于洪涛,等. 基于包含的指针分析优化技术综述[J]. 计算机学报, 2011, 34(7):001224-1238.》
这里介绍的方法是Anderson’s pointer analysis。Anderson的指针分析算法是一种基于约束基于子集(subset-based)的方法。
如下例子的约束关系:
Anderson的指针分析采用WorkQueue的方法。
以上例子,根据该算法可以得到:
参考
- [1] https://blog.csdn.net/dashuniuniu/article/details/78704741