以上下文非敏感分析算法,不考虑调用顺序,可得到如下 PFG。
void main() {
Number n1, n2, x, y;
n1 = new One(); // 𝑜1
n2 = new Two(); // 𝑜2
x = id(n1);
y = id(n2);
int i = x.get();
// 这里 i 的常量分析结果是什么?
}
Number id(Number n) {
return n;
}
interface Number {
int get();
}
class One implements Number {
public int get() { return 1; }
}
class Two implements Number {
public int get() { return 2; }
}

注:实参 n1、n2 会流至形参 n,又由于 return n,n 分别返回至 x、y,因此 o1、o2 流至 x、y 变量里。即,x 指向 o1、o2,x.get() 指向两个目标方法。

若基于上下文敏感的分析方式,区分不同时间对 id 的调用,则会得到这样的 PFG:

对应的也可得到更为精确的分析结果:

C.I. (Context Insensitive)
是什么原因导致了上下文不敏感分析的精度?