Newtank

个人站

欢迎来到我的个人站~


指针分析(一)

目录

指针分析的要素

堆抽象

堆抽象将无限的动态分配出的对象建模为有限的抽象对象

调用点抽象

目前最常见的堆抽象方式。其在每一个创建点分配一个抽象对象来代表其可能的所有具体对象。

上下文敏感性

上下文敏感

对同一个方法的不同调用进行区分。会对一个方法的每一个调用上下文分别分析。

上下文不敏感

将对一个方法的所有调用归并。对每个方法都只分析一次

流敏感性

控制流敏感

考虑语句的执行顺序。会在每个程序位置产生一个指针映射

控制流不敏感

不考虑语句顺序,对所有语句以无序集合处理。会为整个程序产生一个指针映射

分析域

全程序分析

分析整个程序的所有指针,可以提供所有可能的客户程序的信息。

需求驱动

只计算特定的指针。只能面向特定的应用。

记号

\[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的指向集合中