【发布时间】:2014-02-13 10:31:38
【问题描述】:
我想解决的公式在 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)
是可能的,所以我无法相信按位运算会导致这个公式无法满足。
【问题讨论】: