z3py BitVector与整数运算

时间:2018-04-17 18:59:49

标签: z3py

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

  • 使用lst_b屏蔽lst_v中的元素。使用And函数需要屏蔽,因为布尔表达式需要在最后一步中解决。
  • 计算所有剩余元素的xor
  • 使用Solve类的z3py测试结果中设置的所有位。

问题的一个变体是将xor与add

交换

1 个答案:

答案 0 :(得分:1)

你想要达到的目标并不完全清楚;但也许以下内容会让你前进:

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]

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