以上下文非敏感分析算法,不考虑调用顺序,可得到如下 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; }
}

spaces_-MJC1RRYQ991XoNX219t_uploads_git-blob-74be335e6998a7a51a039dc41d1ec5e37a664081_image-20201210134143907.png

注:实参 n1n2 会流至形参 n,又由于 return nn 分别返回至 xy,因此 o1o2 流至 xy 变量里。即,x 指向 o1o2x.get() 指向两个目标方法。

spaces_-MJC1RRYQ991XoNX219t_uploads_git-blob-ea652091b5e786619aec8c552c349cadc7602206_image-20201210134328575.png

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

spaces_-MJC1RRYQ991XoNX219t_uploads_git-blob-126b73eb0cb55a4be295ef5f8b9f74a66b9e043d_image-20201210135019104.png

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

spaces_-MJC1RRYQ991XoNX219t_uploads_git-blob-eaf6714f527eb6e51b47d6d905a61650ba04a9a7_image-20201210135047052.png

C.I. (Context Insensitive)

是什么原因导致了上下文不敏感分析的精度?