“需要widening跳到可靠上界,再用 narrowing 恢复精度。”
Widening 的两项责任 ​
在抽象域
并且对任意上升链
在有限步后稳定。不同教材给出等价或更一般的序列式定义,核心都是“结果保持可靠上界”和“加速序列最终稳定”。
Widening 通常不是格 join,不要求结合、交换、幂等或单调。擅自依赖这些代数律会让 worklist 次序变化时出现未经证明的结果。
区间上界跳跃 ​
经典区间 widening 对
其中若
循环 x:=0; while (...) x:=x+1 的普通 join 迭代产生
永不有限稳定。首次增长时 widening 可从
这个结果可靠却很粗。它不是“猜测真实上界无穷”,而是主动放弃不断移动的有限上界,以保证分析终止。
放置点与延迟策略 ​
不必在每个控制流节点都 widening。常见策略只在循环头或反馈边使用,使无环区域仍以精确 join 传播。选取覆盖每个循环的 widening points 是终止证明的一部分。
可以先做若干普通迭代,再启用 widening;或采用 thresholds,只允许边界跳到程序常量
迭代次序会影响结果。两个语义等价的 CFG 排序可能触发不同 widening 时机,因此工程报告应说明策略,不把输出当成唯一最小解。
Narrowing 恢复精度 ​
得到后不动点
要求在不低于所需具体解的前提下收紧,并在所考虑下降序列上终止。区间 narrowing 常把无穷端点替换为 transfer 计算出的有限端点。
若循环实际条件是 x<100,widening 得
没有可靠上界就开始下降可能漏状态。顺序必须先获得 post-fixpoint,再在保真条件下改进;把 narrowing 当任意“优化结果”的后处理没有证明依据。
失败边界 ​
若所谓 widening 只返回第二个参数
过早 widening 到
并非所有有限高度域都需要 widening:普通单调迭代已会稳定。加入 widening 只会引入额外不确定性,违背最小必要机制。
对嵌套循环,外层和内层 widening point 的调度会互相影响。内层尚未稳定就把粗结果送到外层,可能触发不可逆的无穷边界;完全求稳内层又可能重复昂贵计算。局部 WTO 等策略用控制流的嵌套结构规定更新次序,但每种策略仍需证明所有反馈环最终经过 widening 点。
参考资料
- Patrick Cousot and Radhia Cousot, “Abstract Interpretation: A Unified Lattice Model for Static Analysis,” POPL, 1977, pp. 238–252。
- Patrick Cousot and Radhia Cousot, “Comparing the Galois Connection and Widening/Narrowing Approaches,” PLILP, Springer, 1992, pp. 269–295。
- Xavier Rival and Kwangkeun Yi, Introduction to Static Analysis, MIT Press, 2020, Ch. 10。