不满意的公式?也许错误的语法?

时间:2014-02-13 10:31:38

标签: z3 smt z3py

我想解决的公式在C中看起来像这样:

#define foo(w,x,y) ((((w)*(x)*(y)+31) & ~31) / 8)  
WORD w,x,y,z;  
y = 24;  
if( (foo(w,x,y) * z) == -1 )  
    printf("yeah!");  

我用以下方式将其重写为z3py:

from z3 import *
w= BitVec('w',16)
x= BitVec('x',16)
z= BitVec('z',16)
y= BitVecVal(24,16)
solve( (UDiv( (w*x*y+31) & ~31, 8 )) * z == 0xffffffff)

有什么建议吗? PS:请注意尝试以这种形式解决公式:
solve( (UDiv( (w*x*y+31), 8 )) * z == 0xffffffff)
是可能的,所以我不能相信按位操作导致这个公式不满意。

2 个答案:

答案 0 :(得分:0)

C程序不会为我打印任何内容。 Z3说“没有解决方案”。所以,这是一致的。

你的C程序打印“是啊!”?如果是这样,你不是在大端机器上吗?我在x86机器上试过你的例子。

答案 1 :(得分:0)

我没有看到Z3行为有什么问题。为什么你认为公式应该令人满意?

A =(w * x * y + 31)& ~31 - 暗示最右边的5位总是为零

B = UDiv(A& ~31,8)(等于逻辑右移3) - 暗示最右边的2位始终为零。

C = B * z - 这将始终使最右边的2位为零

c == 0xffffffff - 这是不可能的

如果将常量更改为0xfffffffc,那么您将获得解决方案。