程序分析中的Herbrand等式与模运算分析
1. 引言
在程序分析领域,自动寻找程序中的线性不变式是一个长期被研究的问题。然而,主流编程语言(如Java和C)在进行整数运算时采用模2的幂运算(即整数类型的运算结果对$m = 2^w$取模,其中$w$根据数据类型而定),这给传统的线性不变式分析带来了挑战。
1.1 传统分析的局限性
大多数传统分析方法将变量解释为来自某个域(如有理数集$Q$或$Z_p$,其中$p$为素数)的成员,这使得它们难以检测出在模2的幂运算下成立的线性不变式。例如,对于以下Java程序:
class Eins {
public static void main(String [] argv) {
int x = 1022611261; int y = 0;
if (argv.length > 0) {
x = 1; y = 20;
}
System.out.println("" + (21*x-y));
}
}
除了Granger的分析方法外,其他传统分析方法都无法发现线性不变式$21 \cdot x - y = 1$在程序终止时成立。这是因为Java在进行整数运算时对$m = 2^{32}$取模,而$21 * 1022611261 = 1$(模$2^{32}$)。
1.2 本文的解决方案
本文提出了一种新的分析方法,包括过程内和过程间分析,该方法不仅在模2的幂运算下是可靠的,而且在一定抽
超级会员免费看
订阅专栏 解锁全文
1万+

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



