这个问题之前被问过,但答案非常笼统。我很想知道在静态代码分析的上下文中上下文意味着什么,特别是在 Java 中以及与术语上下文(非)敏感分析结合使用时。
例如,本文在此上下文中广泛使用了“上下文”。事实上,我还没有找到一个体面的上下文定义。
您链接到的问题中的“上下文”一词似乎并未用于描述静态分析,因此您的问题确实是另一个问题。我不认为这个问题的答案是“通用的”。但它们绝对不是您正在寻找的具体答案。
上下文相关分析是一种过程间分析,在分析函数调用的目标时会考虑调用上下文。
以下是上下文相关分析如何工作的示例:
int a,b;
int *x;
void f(void)
{
++*x;
}
int main(){
x = &a;
f();
x = &b;
f();
}
这不是 Java,但您的问题主要是关于数据流分析中的上下文敏感性,所以我希望它不会太令人不安。
上下文相关分析器f()
在此程序中分析(至少)两次,因为它是从调用站点调用的。这使它变得精确,因为f()
每次的效果都完全不同。上下文相关的分析可以推断a==1
和b
在第一次调用之后没有变化,并且在第二次调用之后两者a
和b
都是1
。上下文敏感性也使分析变得昂贵。
上下文不敏感的分析只会分析f()
一次,并且通常只会产生“<code>f() 修改a
或b
,因此在任何调用之后f()
,这两个变量的内容都是未知的”类型的信息。