我目前正在用 Java 做一个过程间分析项目,我正在研究使用 IFDS 求解器来计算程序的控制流图。我发现很难遵循描述 IFDS 框架和图形可达性所涉及的数学。我在几个地方读到它不可能使用这个求解器来计算程序的点到集,因为“指针分析被认为是一个非分布问题”。[1] 其他消息来源说,这通常专门针对“强更新”,据我所知,这是现场写入语句。
我想我基本上可以遵循求解器如何计算边缘并计算出数据流事实。但我不太明白这是什么意思:f(A ∪ B) = f(A) ∪ f(B) 实际上是指分配函数的定义,因此说指向分析意味着什么处理非分配函数。
链接源 [1] 给出了一个特定于字段写入语句的示例:
A a = new A();
A b = a;
A c = new C();
b.f = c;
它声称,为了推理对 bf 的分配,还必须考虑基 b 的所有别名。我可以按照这个。但我不明白的是,这个动作的特性是什么,使它无法分配。
[2] 中的一个类似(我认为)示例:
x = y.n
在语句之前有指向边 y-->obj1 和 obj1.n-->obj2 (其中 obj1 和 2 是堆对象)。他们声称
如果我们独立考虑每个输入边,则不可能正确推断出边 x-->obj2 应该在语句之后生成。该语句的流函数是点到图整体的函数,不能分解为每条边的独立函数,然后合并得到正确的结果。
我想我几乎明白,至少第一个例子在说什么,但我没有理解分配函数的概念,这阻碍了我了解全貌。任何人都可以在不使用我难以理解的集合论的情况下,在指针分析的实际基础上解释什么是分布函数或非分布函数吗?
[1] http://karimali.ca/resources/pubs/conf/ecoop/SpaethNAB16.pdf
[2] http://dl.acm.org/citation.cfm?doid=2487568.2487569(付费专区,抱歉)