迄今为止,我们仅仅采用了第5章和第8章的标准方法论,没有充分利用分配性。但在我们深入研究分配性之前,让我们首先研究一种“可能未初始化变量“分析的替代形式,这是朝向第9.4节描述的IFDS(Interprocedural, Finite, Distributive, Subset Problem)框架迈出的一步。我们分为如下两个阶段:
有趣的是,这两个阶段都是上下文无关的(不是上下文敏感的!),尽管如此,由此产生的分析结果在计算在给定程序点可能未初始化的变量方面达到了与第9.1节中的原始形式相同的精度。
首先,我们来介绍预分析。对于n个节点的CFG,预分析利用如下的格来进行抽象:
尽管我们将其视为上下文无关分析,但这个分析的格看起来与9.1章节的类似。9.1节如下:
在旧的分析中,用于单个CFG节点的格元素是每个上下文的可能未初始化程序变量集。在这个上下文无关的预分析中,用于单个CFG节点的格元素取而代之的是不可达,或具有几乎与之前相同意义的跳转函数$m_v: \mathcal{P}(Vars) \rightarrow \mathcal{P}(Vars)$。这个函数关联包含v的函数入口处的可能未初始化变量集与v处的可能未初始化变量集。格的lift操作稍有不同;这种新分析方法不跟踪每个函数可能在哪些上下文中被调用,而只是跟踪哪些函数可能在某些上下文中被调用,从而提供了一个更粗糙的可达性概念。
基于这种选择,对于不同CFG节点的约束规则可以进行如下定义:
入口节点:主函数的入口节点一定可达;对于函数入口,假设未初始化变量集合是s,那么s就是这个入口节点的结果,因为这是同一个节点。
对于下标$[\![\cdot]\!]1$,这个表示约束变量是第一阶段的变量。对于函数f的入口节点 $entry{~f}$,约束是相同的,除非我们考虑函数的可达性(也就是说,这个函数不会被调用到):
如果没有到f的可达调用,那么在约束的最小解中,我们隐式地有$[[entry_f]]_1 = \text{unreachable}$,因为unreachable是格的底部元素。请注意,在这个预分析中,从调用者传递给被调用者的唯一信息是函数是否可达。与首次制定的可能未初始化变量分析方法不同,函数之间关于哪些变量可能未初始化没有信息流动。
**赋值语句:**对于赋值语句的节点 $v: X = E$,利用函数组合来描述约束规则,