指针分析的要素
堆抽象
堆抽象将无限的动态分配出的对象建模为有限的抽象对象
调用点抽象
目前最常见的堆抽象方式。其在每一个创建点分配一个抽象对象来代表其可能的所有具体对象。
上下文敏感性
上下文敏感
对同一个方法的不同调用进行区分。会对一个方法的每一个调用上下文分别分析。
上下文不敏感
将对一个方法的所有调用归并。对每个方法都只分析一次
流敏感性
控制流敏感
考虑语句的执行顺序。会在每个程序位置产生一个指针映射
控制流不敏感
不考虑语句顺序,对所有语句以无序集合处理。会为整个程序产生一个指针映射
分析域
全程序分析
分析整个程序的所有指针,可以提供所有可能的客户程序的信息。
需求驱动
只计算特定的指针。只能面向特定的应用。
记号
\[Variables:x,y\in V\\ Fields:f,g\in F\\ Objects:o_i,o_j\in O\\ Instance\ fields: o_i.f,o_j.g\in O\times F\\ Pointers: Pointer=V\ \bigcup\ (O\times F)\\ Points-to\ relations: pt=Pointer\rightarrow P(O)\]$P(O)$为$O$的幂集,$pt(p)$表示$p$的指向集合
规则
New
i: x = new T()
的规则为
\[\overline{o_i\in pt(x)}\]将$o_i$加入x指向对象集合中,其为无条件(必定)发生的。
Assign
x = y
的规则为
\[\underline{o_i\in pt(y)}\\ o_i\in pt(x)\]如果$o_i$在y的集合中,则加入x的集合中,即将y指向的对象集合加入x指向对象集合中。
Store
x.f = y
的规则为
\[\underline{o_i\in pt(x),o_j\in pt(y)}\\ o_j\in pt(o_i.f)\]即将y指向的所有对象加入x指向的每一个对象的f中。
Load
y = x.f
的规则为
\[\underline{o_i\in pt(x),o_j\in pt(o_i.f)}\\ o_j\in pt(y)\]即将x指向的每一个对象的f加入y的指向集合中