同余自动抽象:原理与算法解析
在程序验证领域,推断程序变量之间的数值关系一直是一个重要的研究方向。特别是对于位操作算法的验证,通过推导构成程序变量的位之间的不变量是一种有效的方法。这些不变量通常可以用同余方程组来描述,其中每个方程的形式为 (c \cdot x = d \mod m),这里 (m) 是 2 的幂,(c) 是整数系数向量,(x) 是命题变量(位)向量。由于这些不变量的底层性质以及涉及的大量位,自动推导转移函数显得尤为重要。
1. 引言
近年来,人们对推断程序变量之间的数值关系,尤其是同余关系,重新产生了浓厚的兴趣。在同余抽象域中,每个描述都是一个同余方程组(涉及 (n) 个变量),形式为 (c \cdot x = d \mod m),简记为 (c \cdot x \equiv_m d),表示存在一个整数 (k) 使得 (c \cdot x = d + km)。这种同余系统不仅具有很强的表达能力,而且在计算上也具有吸引力。如果 ([0, m - 1]) 范围内的值可以用机器整数表示,那么在抽象操作中可以避免任意精度算术,同时还能获得多项式性能保证。
特别值得关注的是 (m) 为 2 的幂的同余关系,因为它们可以表达在机器字或位级别上成立的不变量。例如,在一些位操作程序中,如计算 (x) 的奇偶性或反转 16 位字 (x) 的程序,往往会建立一些重要但不明显的不变量。对这类程序进行完全精确的位分析,除了最简单的无循环程序外,几乎是不可行的。然而,这些不变量通常可以简洁地表示为同余方程组。但由于涉及的赋值操作不是线性的,传统的同余分析方法并不适用。一种替代方法是对位精确地总结基本程序块,并谨慎地应用同余闭包,这样即使对于有循环的流程图程序,也能揭示位之间的“数值”不变量。
超级会员免费看
订阅专栏 解锁全文
16万+

被折叠的 条评论
为什么被折叠?



