“在抽象域 $(A,\sqsubseteq)$ 上,二元操作 $\nabla:A\times A\to A$ 是 widening,若至少满足上界性”
抽象值代表具体状态集合 ​
设具体状态集合为
抽象域由抽象元素集合
组成。本文采用的方向是
所以较小元素更精确,较大元素覆盖更多具体状态。若文献采用“信息更多者更大”的反向次序,join、meet 与迭代方向也要一起翻转,不能只改符号。
用于不动点分析时,
符号抽象域 ​
对一个整数变量
其解释例如
若程序执行 x := x*x,任何输入的输出都非负,故抽象转移可把 x := x+1,neg 输入可能仍负、变零或变正,粗符号域只能返回
环境域与控制流合流 ​
多个变量的抽象环境可写作点态函数
函数空间按变量逐点排序和 join。例如一条分支结束时得到
逐变量乘积是非关系域:它能分别记录
抽象域因而同时规定可表达性质与精度上限。更丰富不总是更合适;分析目标若只需证明数组长度非负,完整多面体域可能增加成本而不改变结论。
可靠、精确与最佳表示 ​
抽象值
可靠允许额外状态,不能推出没有假警报。精确则是相对概念:在同一域内,
某些具体集合在域中没有最精确表示。例如只含 even 和 odd 区别的事实无法由纯符号域表达。即使最精确抽象存在,计算它也可能昂贵;Galois 连接会形式化 abstraction
meet 表示同时施加两个抽象约束,但其 concretization 可能只是交集的可靠近似;join 表示覆盖替代分支。把程序分支的“二选一”误用 meet 会漏掉行为,直接破坏 soundness。
区间、终止与分析边界 ​
区间是数值抽象域的典型实例:每个变量由上下界表示,能高效传播范围,却会丢失变量相关性。区间算术自身的向外舍入保证与静态分析的抽象转移可靠性属于两层证明,完整例子由后续区间抽象域页面承担。
完备格保证语义上的任意 join 存在,不保证朴素迭代有限步终止。无限上升链可以让分析不断产生更宽界;widening 会主动跳到更粗上界以换取终止,结果通常不是最小不动点。
抽象域也不等同于分类标签清单。若没有次序、
从域到完整分析 ​
仅选定
这个分层避免把“域很精细”误写成“分析正确”。一个关系域若转移函数漏掉整数溢出仍不可靠;一个粗糙的符号域只要覆盖所有具体结果,依然可以给出可信但保守的证明。
参考资料
- Patrick Cousot and Radhia Cousot, “Abstract Interpretation: A Unified Lattice Model for Static Analysis,” POPL, 1977, pp. 238–252。
- Flemming Nielson, Hanne Riis Nielson, and Chris Hankin, Principles of Program Analysis, Springer, 1999, Chs. 2–4。
- Xavier Rival and Kwangkeun Yi, Introduction to Static Analysis, MIT Press, 2020, Chs. 5–7。
- Antoine Miné, “A Few Graph-Based Relational Numerical Abstract Domains,” SAS, Springer, 2002, pp. 117–132。