Archipelago

Lec 12数据流分析的理论基础(Foundations of Dataflow Analysis)

讲义完成更新于 2026-09-16
后续

当前课程暂无后续已收录内容。

Lec 12 数据流分析的理论基础(Foundations of Dataflow Analysis)

内容:格论、偏序、传递函数、单调性/分配性、工作表算法、抽象函数与路径汇合解 这是 L8 数据流分析的形式化数学基础

TL;DR

  • 格用偏序表达分析信息的精度,join / meet 定义控制流汇合时如何安全地合并事实。
  • 单调传递函数与有限升链使工作表算法收敛到最小不动点,到达定义、可用表达式和活跃性都是该框架的实例。
  • 抽象函数解释了分析为何健全但可能不精确;分配性决定工作表解是否等于理想的路径汇合解,无限升链则需要 widening。

1. 基本思想

数据流分析是编译期对变量/表达式运行期值在不同程序点的推理。核心思路:用一个代数结构——格 (lattice) 的元素表示程序信息,分析为每个程序点产生一个格值。两种风味:前向 (forward) 与 后向 (backward) 数据流分析。

程序表示:CFG,节点 NN 是语句、边 EE 是控制流,pred(n)/succ(n) 为前驱/后继,起点 n0n_0,终点集 NfinalN_{final}。程序点:每节点前后各一个;汇合点 (join) 多前驱,分裂点 (split) 多后继。

  • 前向分析:值随控制流前向传播,节点有传递函数 ff(输入=节点前的值,输出=节点后的值),在汇合点用合并函数组合。典型:到达定义。
  • 后向分析:值逆控制流后向传播(输入=节点后的值,输出=节点前的值),在分裂点合并。典型:活跃变量。

2. 偏序与格(Partial Orders & Lattices)

定义(偏序 Partial Order)

集合 PP 上的偏序 ≤\le 满足对所有 x,y,zx,y,z:自反 x≤xx\le x、反对称 x≤y∧y≤x⇒x=yx\le y \wedge y\le x \Rightarrow x=y、传递 x≤y∧y≤z⇒x≤zx\le y \wedge y\le z \Rightarrow x\le z。

定义(上/下界、lub/glb)

对 S⊆PS \subseteq P:

  • 上界 xx:∀y∈S. y≤x\forall y\in S.\ y\le x;最小上界 (lub) 记 ∨S\vee S(join、supremum),x∨yx\vee y 是 {x,y}\{x,y\} 的 lub。

  • 下界 xx:∀y∈S. x≤y\forall y\in S.\ x\le y;最大下界 (glb) 记 ∧S\wedge S(meet、infimum),x∧yx\wedge y 是 {x,y}\{x,y\} 的 glb。 :::

若对所有 x,y∈Px,y\in P,x∧yx\wedge y 与 x∨yx\vee y 都存在,则 PP 是格 (lattice)。若对所有 S⊆PS\subseteq P,∧S\wedge S 与 ∨S\vee S 都存在,则是完全格 (complete lattice);所有有限格都完全。最大元为 top,最小元为 bottom (⊥\bot)。

例:整数 II 在 max/min 下是格但不完全(∨I\vee I 不存在),I∪{+∞,−∞}I\cup\{+\infty,-\infty\} 完全。布尔超立方 {0,1}n\{0,1\}^n(x≤yx\le y ⟺ 按位与 = xx)是完全格,用 Hasse 图表示覆盖关系。

2.1 ≤\le、∧\wedge、∨\vee 的等价联系

定理(三者等价)

以下三条等价:x≤yx\le y ⟺ x∨y=yx\vee y = y ⟺ x∧y=xx\wedge y = x。

可反过来用 ∨,∧\vee,\wedge 定义 ≤\le:取满足结合、交换、幂等、吸收律的任意 ∨,∧\vee,\wedge,定义 x≤yx\le y 当 x∨y=yx\vee y=y,可证 ≤\le 是偏序,且 x∨y=sup⁡{x,y}x\vee y=\sup\{x,y\}、x∧y=inf⁡{x,y}x\wedge y=\inf\{x,y\}。这把格视作信息组合的代数结构(∨\vee 为"或/合并",∧\wedge 为"与")。

2.2 链与升链条件

定义(链、升链条件 ACC)

SS 是链 (chain):∀x,y∈S. x≤y∨y≤x\forall x,y\in S.\ x\le y \vee y\le x。PP 满足升链条件 (ascending chain condition):对任意升序列 x1≤x2≤⋯x_1\le x_2\le\cdots,存在 nn 使 xn=xn+1=⋯x_n = x_{n+1}=\cdots(即无限升链不存在)。

ACC 是数据流分析终止性的关键:解算法产生每点的递增值序列,ACC 保证有限步收敛。


3. 传递函数(Transfer Functions)

定义(传递函数族 F 的条件)

每个分析问题有一族传递函数 f:P→Pf: P\to P:

  • 含恒等函数 i∈Fi\in F;

  • 对复合封闭:f,g∈F⇒λx.f(g(x))∈Ff,g\in F \Rightarrow \lambda x.f(g(x))\in F;

  • 每个 ff 单调 (monotone):x≤y⇒f(x)≤f(y)x\le y \Rightarrow f(x)\le f(y);

  • 有时还分配 (distributive):f(x∨y)=f(x)∨f(y)f(x\vee y)=f(x)\vee f(y)。 :::

若 f(x∨y)=f(x)∨f(y)f(x\vee y)=f(x)\vee f(y),则由 x∨y=yx\vee y=y 得 f(y)=f(x∨y)=f(x)∨f(y)f(y)=f(x\vee y)=f(x)\vee f(y),即 f(x)≤f(y)f(x)\le f(y)。故分配 ⟹ 单调(反之不然)。


4. 前向数据流分析框架

定义(前向数据流方程)

每节点 nn 有 innin_n(前)、outnout_n(后)、传递函数 fnf_n。解须满足: outn=fn(inn),inn=⋁m∈pred(n)outm (n≠n0),inn0=Iout_n = f_n(in_n), \qquad in_n = \bigvee_{m\in pred(n)} out_m \ (n\ne n_0), \qquad in_{n_0} = I 其中 II 概括程序起点的信息。

工作表算法(前向):

for each n: out_n = f_n(⊥)
in_{n0} = I; out_{n0} = f_{n0}(I); worklist = N - {n0}
while worklist ≠ ∅:
    取出 n
    in_n = ⋁_{m∈pred(n)} out_m
    out_n = f_n(in_n)
    if out_n 改变: worklist ∪= succ(n)

定理(正确性与终止性)

正确性:每处理 nn 即令 outn=fn(inn)out_n=f_n(in_n);每当 outmout_m 变就把 succ(m)succ(m) 入表,故最终解满足全部方程。 终止性:inn/outnin_n/out_n 取值序列是链,若停止增长则工作表清空;若格满足升链条件(如有限格)则必终止。无 ACC 时用加宽算子 (widening)——检测可能属无限升链的值,人为升到链的 lub(如把大小 ≥ n 的集合升到 TOP)。


5. 后向数据流分析框架

定义(后向数据流方程)

inn=fn(outn),outn=⋁m∈succ(n)inm (n∉Nfinal),outn=O (n∈Nfinal)in_n = f_n(out_n), \qquad out_n = \bigvee_{m\in succ(n)} in_m \ (n\notin N_{final}), \qquad out_n = O\ (n\in N_{final})

工作表算法对称:沿后继求 outnout_n,innin_n 变化时把 pred(n)pred(n) 入表。


6. 三大经典分析作为格实例

定义(三大分析的格参数)

分析P∨(join)序⊥初值
到达定义定义集的幂集∪⊆∅I=∅(前向)
可用表达式表达式集的幂集∩⊇PI=∅(前向)
活跃变量变量集的幂集∪⊆∅O=∅(后向)

三者传递函数都是 GEN/KILL 形式:f(x)=a∪(x−b)f(x) = a\cup(x-b)(aa=GEN,bb=KILL)。

定理(GEN/KILL 框架满足全部性质)

所有 f(x)=a∪(x−b)f(x)=a\cup(x-b) 形式的框架都满足恒等 (a=b=∅a=b=\varnothing)、分配 (f(x)∪f(y)=a∪((x∪y)−b)=f(x∪y)f(x)\cup f(y)=a\cup((x\cup y)-b)=f(x\cup y)) 与复合封闭 (f1(f2(x))=(a1∪(a2−b1))∪(x−(b2∪b1))f_1(f_2(x))=(a_1\cup(a_2-b_1))\cup(x-(b_2\cup b_1)),仍是 GEN/KILL 形式)。

保守性 (Conservatism):到达定义用 ∪\cup(沿任一路径到达即考虑),可用表达式用 ∩\cap(须沿所有路径可达);优化须保守地考虑所有可能执行,分析结构随用途而变。


7. 分析结果的语义:抽象函数与正确性

定义(程序执行与抽象函数)

程序状态 ss 是变量到值的映射,⟨s,n⟩\langle s,n\rangle 表示状态 ss 在节点 nn。执行是轨迹 ⟨s0,n0⟩;… ;⟨sk,nk⟩\langle s_0,n_0\rangle;\dots;\langle s_k,n_k\rangle。抽象函数 (abstraction function) AF:ST→PAF: ST\to P 把具体状态映到格元素,赋予分析结果意义。

定理(正确性条件 / 健全性 Soundness)

对任意执行 ⟨s0,n0⟩;… ;⟨sk,nk⟩\langle s_0,n_0\rangle;\dots;\langle s_k,n_k\rangle 与其中 s=si,n=nis=s_i, n=n_i,有 AF(s)≤innAF(s) \le in_n 即分析在 nn 前产生的结果"安全地高估"了任意实际执行的抽象。可对执行长度归纳证明(用传递函数单调性)。

7.1 例:符号分析(Sign Analysis)

基础格是 {−,0,+}\{-,0,+\} 的平坦格(加 TOP/BOT);实际格为"每变量一个符号"的映射格(f1≤f2f_1\le f_2 ⟺ 逐变量 ≤\le)。解释:BOT=无信息、TOP=可正可负可零。传递函数:v=c 置 v 为 c 的符号;v1=v2*v3 用符号乘表 ⊗\otimes。

例题(符号分析的两类不精确)

a=1; if(...) b=-1 else b=1; c=a*b;
两支汇合 b→TOP,故 c→TOP。

抽象不精确:把具体值 1 抽象成 +,格值比执行值粗。控制流不精确:用单个格值概括所有控制流路径(join 上移合并不同路径),任一具体执行中 b 其实非 TOP。不精确换取可解性(有限格、抽象无界值集、用 join 概括无界状态)。


8. 路径汇合解与分配性(Meet Over Paths & Distributivity)

定义(理想解:路径汇合解 MOP)

对到达 nn 的路径 p=n0,n1,…,nk,np = n_0,n_1,\dots,n_k,n,fp(⊥)=fnk(⋯fn0(⊥)⋯ )f_p(\bot) = f_{n_k}(\cdots f_{n_0}(\bot)\cdots)。理想解应满足 ⋁{fp(⊥):p 是到 n 的路径}=inn\bigvee\{f_p(\bot) : p\text{ 是到 }n\text{ 的路径}\} = in_n

定理(工作表解 vs . MOP)

  • 工作表算法总产生满足"对所有到 nn 的路径 pp,fp(⊥)≤innf_p(\bot)\le in_n"的解(归纳 + 单调性证明),即工作表解 ≤(不优于)MOP。

  • 若框架分配,则工作表算法恰好产生 MOP 解(分配保持精度)。 :::

8.1 缺乏分配性的反例(常量计算器)

平坦整数格。考虑 c = a+b 的传递函数 ff:

f([a→3,b→2]) ∨ f([a→2,b→3]) = [a→TOP,b→TOP,c→5]      (先算后并:c=5 精确)
f([a→3,b→2] ∨ [a→2,b→3]) = f([a→TOP,b→TOP]) = [...,c→TOP]  (先并后算:c=TOP 粗)

两者不等 ⟹ 不分配,工作表解(c→TOP)不如 MOP(c→5)精确。

补救:在不同路径上保留值的组合 {[a→2,b→3],[a→3,b→2]} 可恢复分配,但组合爆炸(指数)且无限升链致不终止;用加宽算子消爆炸(按变量粒度),但损失精度。

8.2 多个不动点

定理(最小不动点)

数据流分析生成最小不动点 (least fixed point);方程可能有多个不动点(如可用表达式在含环 CFG 上既有全 0 解也有全 1 解),算法选最小(最保守安全)的那个。


我的理解

抽象分析的价值不在于完美还原运行时,而在于选择一个有限、可收敛且仍能证明所需性质的信息空间。精度与终止之间的取舍,是设计一个分析时最根本的工程选择。

9. 格、不动点与分析精度小结

  • 数据流信息 = 格元素;偏序/lub/glb/完全格/Top-Bottom 是骨架,升链条件保证终止。
  • 传递函数须含恒等、复合封闭、单调(有时分配,分配⟹单调);前/后向框架对称,工作表迭代到最小不动点。
  • 三大分析是 GEN/KILL 格实例(到达定义 ∪/可用表达式 ∩/活跃 ∪),GEN/KILL 自动满足恒等、分配、复合。
  • 抽象函数 AFAF 联系执行与分析,健全性 AF(s)≤innAF(s)\le in_n;不精确来自抽象与控制流合并,换取可解性。
  • 理想是 MOP 解;分配框架下工作表 = MOP,非分配(如常量传播)则工作表更保守;解为最小不动点;无 ACC 时用加宽。