“区间抽象域会把程序中每个变量映射到区间,并在控制流汇合处做 join、在循环中做 widening。它的静态分析可靠性还需证明抽象转移函数覆盖所有具体程序步骤;本页只提供算术操作的集合外包络…”
区间格与环境 ​
单变量区间域包含空元素
按集合包含诱导精度次序:
所以更窄区间更精确,
多变量抽象状态是环境
transfer 与分支过滤 ​
赋值 x := y + z 使用区间算术:
其他变量不变。对机器浮点程序,端点需向外舍入;对数学整数程序,则需处理无穷端点和语言溢出语义。
条件 x < c 的真分支可与
乘法、除法和非线性函数要分别给 inclusion transformer。除数区间包含零时,返回一个普通有限商区间会漏行为;可返回
完整循环轨迹 ​
分析程序:
x := 0
while x < 10:
x := x + 1
assert x == 10
循环头普通迭代依次得到
这次有限常量界使迭代最终停止,但若条件或上界未知,链可无限增长。使用区间 widening 时,首次上界增长可跳到
真分支 guard 把它收紧到
每一步分别展示 join、guard、transfer、widening 与 narrowing,不能只报最终区间而隐藏为何可靠、何处损失精度。
相关性丢失的假警报 ​
若程序先令 y := x,区间环境只记录 assert x-y==0 时,自然区间减法得到
无法证明结果恒零。真实执行没有错误,警报来自变量相关性丢失。
把区间换成更高精度浮点端点不会恢复
分支拆分可以局部恢复精度,但路径数可能指数增长。区间域的价值正是低成本合流,不能同时承诺保留全部路径关系。
两层可靠性 ​
底层区间算术要证明每次机器端点运算向外包含精确数学结果。上层静态分析还要证明变量环境、guard、赋值、join 与循环求解覆盖所有语言执行。
底层可靠不代表上层自动可靠:若分析把有符号溢出当数学整数,仍会漏状态。上层 transfer 正确也不代表端点实现可靠:最近舍入可能把真实边界舍到区间内。
区间分析给出范围不变量,不证明程序终止、数组索引语义正确或模型与部署环境一致。每个结论应写出整数/浮点模型与异常规则。
参考资料
- Patrick Cousot and Radhia Cousot, “Static Determination of Dynamic Properties of Programs,” ISOP, Dunod, 1976, pp. 106–130。
- Antoine Miné, “Tutorial on Static Inference of Numeric Invariants by Abstract Interpretation,” Foundations and Trends in Programming Languages 4(3–4), 2017, pp. 120–372。
- Xavier Rival and Kwangkeun Yi, Introduction to Static Analysis, MIT Press, 2020, Chs. 9–10。