z3py BitVector 与整数运算混合
z3py BitVector mixed with integer operations
有一个 (lst_v
) BitVectors 列表和一个 (lst_b
) 布尔表达式值列表。你如何使用 z3py 执行以下操作:
- 使用
lst_b
屏蔽 lst_v
中的元素。掩码需要使用 And
函数,因为布尔表达式需要在最后一步解决。
- 计算所有剩余元素的异或
- 使用 z3py 的
Solve
class 测试结果中设置的所有位。
问题的一个变体是用加法交换异或
还不完全清楚您要实现的目标;但也许以下内容会让您继续前进:
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 位数量。
有一个 (lst_v
) BitVectors 列表和一个 (lst_b
) 布尔表达式值列表。你如何使用 z3py 执行以下操作:
- 使用
lst_b
屏蔽lst_v
中的元素。掩码需要使用And
函数,因为布尔表达式需要在最后一步解决。 - 计算所有剩余元素的异或
- 使用 z3py 的
Solve
class 测试结果中设置的所有位。
问题的一个变体是用加法交换异或
还不完全清楚您要实现的目标;但也许以下内容会让您继续前进:
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 位数量。