我正在考虑验证机器代码程序。由于现代SMT解决方案很多 有效地支持数组,我打算在我们的数据库中使用它们 验证工具。我正在玩z3,我注意到了 对公式的小改动会导致超时。
以下是我使用的两个示例:
1)http://rise4fun.com/Z3/e4Ci *公式:=(array_32_8_0_1_0 == array_32_8_0_0_0)和(EBP_1_1_0 == EBP_1_0_0)和(不(array_32_8_0_1_0 [EBP_1_1_0 - 0] == array_32_8_0_1_0 [EBP_1_0_0 - 0]))* 对于这个例子,我变得不满意,这很好!
2)http://rise4fun.com/Z3/t8aT *公式:=(array_32_8_0_1_0 == array_32_8_0_0_0)和(EBP_1_1_0 == EBP_1_0_0)和(不(array_32_8_0_1_0 [EBP_1_1_0 - 1] == array_32_8_0_1_0 [EBP_1_0_0 - 1]))* 对于这个例子,我得到一个超时。在我的机器上运行它 z3.exe一小时也没给我任何东西。这个例子是 与(1)几乎相同,只是数组访问涉及线性表达式。 (看看第16行的temp-var-4的定义)
为什么会这样?它与位向量的组合有关吗? 和阵列理论?