“抽象垃圾回收在静态机器状态中删除已不可能被当前计算再次访问的抽象存储项。它使用的抽象域仍覆盖可能执行,但不必让每个已经失去引用的旧值永远黏在后续重用地址上。”
形式陈述
抽象值代表具体状态集合
设具体状态集合为
抽象域由抽象元素集合
组成。本文采用的方向是
所以较小元素更精确,较大元素覆盖更多具体状态。若文献采用“信息更多者更大”的反向次序,join、meet 与迭代方向也要一起翻转,不能只改符号。
用于不动点分析时,
直觉
符号抽象域
对一个整数变量
其解释例如
若程序执行 x := x*x,任何整数输入的输出都非负,故抽象转移可把 x := x+1 则要用整数边界实际计算:neg 的最佳输出是 nonpos,不是
同一语句若从 nonpos 出发,输出包含负数、零和正数
例子与边界
环境域与控制流合流
多个变量的抽象环境可写作点态函数
函数空间按变量逐点排序和 join。例如一条分支结束时得到
逐变量乘积是非关系域:它能分别记录
抽象域因而同时规定可表达性质与精度上限。更丰富不总是更合适;分析目标若只需证明数组长度非负,完整多面体域可能增加成本而不改变结论。
可靠、精确与最佳表示
抽象值
可靠允许额外状态,不能推出没有假警报。精确则是相对概念:在同一域内,
不能精确表示与不存在最佳近似是两回事。全体偶数在上述符号域中不能被精确表示,但仍有唯一最佳可靠近似
若每个具体集合都有最佳近似,可用
仅由
区间、终止与分析边界
区间是数值抽象域的典型实例:每个变量由上下界表示,能高效传播范围,却会丢失变量相关性。区间算术自身的向外舍入保证与静态分析的抽象转移可靠性属于两层证明,完整例子由后续区间抽象域页面承担。
完备格保证语义上的任意 join 存在,不保证朴素迭代有限步终止。无限上升链可以让分析不断产生更宽界;widening 会主动跳到更粗上界以换取终止,结果通常不是最小不动点。
抽象域也不等同于没有解释的分类标签清单。次序与 concretization 给出谁更精确、每个元素覆盖哪些状态,局部转移的可靠包含可以直接在这个接口上陈述。若所选求解器还使用
推论与应用
从域到完整分析
仅选定
这个分层避免把“域很精细”误写成“分析正确”。一个关系域若转移函数漏掉整数溢出仍不可靠;一个粗糙的符号域只要覆盖所有具体结果,依然可以给出可信但保守的证明。
参考资料
-
Patrick Cousot, “Abstract Interpretation”, 作者在线综述,§§3.5–3.7,解释最佳近似、Galois 连接与 Moore 完备化。
-
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。