以上下文非敏感分析算法,不考虑调用顺序,可得到如下 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)
是什么原因导致了上下文不敏感分析的精度?