“多面体抽象域进一步允许任意有理系数的仿射关系:用旧变量改名和实数投影证明赋值精确,再以两个分支、闭凸包汇合、guard 与仿射赋值完成关系断言的证书。例中每次转移都精确,但汇合产生的伪状态仍…”
形式陈述 ​
元素、次序与汇合 ​
固定
其中约束条数
两个元素的 meet 是交集,拼接两组不等式即可。join 是包含它们的最小闭凸多面体:
有限个有理多面体的闭凸包仍是有理多面体;任意包含
guard 与仿射赋值 ​
对 assume a·x <= c,精确过滤是
对赋值 x_k := a·x+c,先把整份旧状态改名为
右侧是一个有限线性系统在新坐标上的投影,仍可由有限有理不等式表示。它恰好收集
直觉
约束方向随程序关系而变化 ​
区间只保存每个变量独立的范围;多面体则可以保存
这种表达力仍受凸性约束。若程序只可能落在两条分离线段上,多面体必须同时包含线段之间的凸组合。单条仿射赋值即使精确地映射了这个外包络,也不会自动识别哪些输入点来自汇合时填入的空隙。“转移精确”与“整个分析等于真实可达集”是两个不同结论。
消元为什么在实数上精确 ​
消去一个实数旧变量
以及所有不含
这就是 Fourier–Motzkin 消元的一步。反复消去旧变量便得到赋值后的 H-表示,同时也说明其成本来源:一次消元可能把上、下界成对组合,约束数量会迅速增长。冗余删除能减少表示长度,却不改变所得集合。
例子与边界
从两个分支到一份完整断言证书 ​
下面的 nondet() 非确定地选择任一分支;所有变量均为无界精度实数。
x := input_real(); assume 0 <= x <= 2
if nondet(): y := 2*x
else: y := 2*x+2
assume y <= 3
x := 2*x+y
assert 2*y-2 <= x and x <= 2*y and x <= 6
赋值后的两个分支分别是线段
它们的 join 为
验证等号的两边也很直接:右侧是包含两段的凸集;反过来,每个
guard 将
最后一次赋值需要区分旧
用
其中
这不是只列出必要条件:若
断言的前两项直接是
这份安全证书没有声称
例如
为什么 join 要取闭包 ​
取原点
例如
整性、严格性与机器运算 ​
本页的消元依赖实数见证。若
非严格闭半空间也无法精确表达实数 guard
推论与应用
有限行删除如何迫使迭代停止 ​
关系更丰富并不会消除无限上升链。考虑
使用加宽与收窄时,一种容易核验的有限行删除方案是:固定
每条保留行原先在
终止论证有一个表示层面的前提:后续迭代始终从同一初始有限行集中删除,不能重新生成或插回已经删除的行。若初始有
这里介绍的是带有明确历史限制的、依赖行表示的删除加宽。冗余行的选取会影响保留下来的信息,任意重新规范化后再删行不能沿用这份终止证明;完整的标准多面体加宽还需处理最小表示与约束替换等条件。加宽所得不变量也不保证是最小不动点。
选择此域需要的收益与代价 ​
本例的关键关系是斜率为二的边界。允许任意有理系数使这些边界在赋值后继续可表示,因而可以直接读取安全断言。收益来自保存程序所需的关系,不只是把每个变量的独立范围算得更紧。
代价同样来自自由方向:消元可能制造大量约束,凸包可能需要 H/V 表示转换,包含检查还要证明每条目标不等式被输入蕴含。实际分析常按变量组使用多面体,并在循环头谨慎安排加宽。本页提供的终点是可逐步复核的前向安全证书;若目标变成非凸路径区分、整数同余或非线性不变量,还需要另外的表示能力。
参考资料
- Antoine Miné, “Tutorial on Static Inference of Numeric Invariants by Abstract Interpretation”, 2017 作者版,§§5.3.1–5.3.4,印刷页 110–118。讨论多面体表示、投影与赋值、无界 join 的闭包以及朴素和改进加宽。
- Roberto Bagnara, Patricia M. Hill and Enea Zaffanella, “Widening Operators for Powerset Domains”,19 页作者稿,§§2.2–2.3,Definitions 2–3,PDF 页 3–5。此处使用其基础多面体域与标准加宽的表示条件,不涉及幂集域扩展。
- Patrick Cousot and Nicolas Halbwachs, “Automatic Discovery of Linear Restraints Among Variables of a Program”, POPL, 1978。链接用于核对原始工作的题名与出处;本页算子与证明机制依据上列已核对的作者资料展开。