我想解决的公式在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)
是可能的,所以我不能相信按位操作导致这个公式不满意。
答案 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,那么您将获得解决方案。