« 上一篇下一篇 »

相关指针分析

上下文相关性可以大大提高过程间分析的精确性。我们讨论了两种过程间分析的方法一种基于克隆的方法,另一种是基于摘要的方法。那么我们应该使用哪一个方法呢?

在计算指针指向信息的摘要时有几个难点。首先,这些摘要很大。每个方法的摘要必须包括这个函数和所有被调用者可能做出的所有更新所产生的影响。这些影响需要用输人参数来表示。也就是说,一个方法可能改变的指向集合包括:所有可通过静态变量及输人参数到达的所有数据的指向集合,以及由该方法及被调用方法所创建的全部对象的指向集合。虽然人们已经给 出了复杂的解决方案,但是现在还没有解决方法可以被应用到大型程序中。即使摘要可以通过自底向上的方式计算得到,但如何在一个典型的自顶向下处理过程中计算所有上下文环境下的指针指向集合是一个更大的问题。因为上下文环境的数量可能按照指数级增长。这样的信息对于一些全局性查询是必须的,比如在代码中找出指向某个特定对象的所有指针。

我们将讨论基于克隆的上下文相关分析技术。基于克隆的分析直接为每个感兴趣的上下文都给出一个对应方法的克隆。然后,我们对克隆得到的调用图进行上下文无关分析。虽然这个方法看起来简单,但最大的难点在于如何处理大量克隆的细节。有多少个上下文?把这么多上下文的分析结果用某种方式表示出来是我们所面临的挑战。

我们把对上下文相关性的讨论分成两个部分:

1)如何在逻辑上处理上下文相关性?这个部分较为简单,因为可以直接对克隆得到的调用图应用上下文无关的分析算法。

2)如何表示指数量级的上下文?方法之一是把这个信息表示为一个二分决策图(BDD)。这是一个经过高度优化的数据结构,曾经用于很多其他的应用。

这个处理上下文相关性的方法很好地说明了抽象方面的重要性。我们将说明如何应用人们多年来在BDD抽象方面所做的工作来消除算法的复杂性。我们可以用很少几行Datalog程序来表示一个上下文相关的指针指向分析。而这个程序利用了已有的几千行用于BDD数据操作的代码。这个方法具有多个重要的优势。首先,它使得人们能够比较容易地表示那些利用指针指向分析结果进行深度分析的技术。无论如何,指针指向分析结果本身并不令人感兴趣。第二,它使得正确写出这个分析方法的任务变得容易得多,因为它利用了很多行经过充分调试的代码。

« 上一篇下一篇 »