z3py BitVector 与整数运算混合

z3py BitVector mixed with integer operations

有一个 (lst_v) BitVectors 列表和一个 (lst_b) 布尔表达式值列表。你如何使用 z3py 执行以下操作:

问题的一个变体是用加法交换异或

还不完全清楚您要实现的目标;但也许以下内容会让您继续前进:

from z3 import *

# Assume we have a list of 3 32-bit values
x, y, z = BitVecs('x y z', 32)
lst_v = [x, y, z]

# Corresponding booleans:
mx, my, mz = Bools('mx my mz')
lst_b = [mx, my, mz]

# 32-bit zero
zero = BitVecVal(0, 32)

# Mask
masked = [If(b, v, zero) for (b, v) in zip(lst_b, lst_v)]

# Xor reduce
final = reduce(lambda x, y: x^y, masked, zero)

# 32-bit all 1's
allOnes = BitVecVal(-1, 32)

s = Solver()
s.add(final == allOnes)

# make it interesting, assert some known values and constraints
s.add(x == BitVecVal(123212, 32))
s.add(UGT(x + y,  z+12))
s.add(ULT(y, allOnes))

if s.check() == sat:
   print s.model()
else:
   print "No solution"

当我 运行 这个时,我得到:

[mz = True,
 mx = False,
 my = True,
 z = 2147479427,
 y = 2147487868,
 x = 123212]

这表明,我应该将 y 和 z 异或为 32 位值;给出 4294967295,它的所有位都设置为 32 位数量。