Z3 - 如何在 BitVec 上设置字节约束

Z3 - How to set a byte constraint on a BitVec

我正在尝试在 BitVec 中设置可能允许的字节列表,但我不确定我是否以正确的方式设置了约束。

例如:

让我们有一个名为 bv 的 32 位 BV 和一个名为 sSolver():

s = Solver()
bv = BitVec(8 * 4)

我希望每个字节可以是 0x20x340xFF 所以我使用了 Extract():

i = 0
while (i < 8 * 4):
    s.add(Extract(i + 7, i, bv) == 0x2)
    s.add(Extract(i + 7, i, bv) == 0x34)
    s.add(Extract(i + 7, i, bv) == 0xFF) 
    i += 8

可悲的是,s.check() returns unsat

我认为这不是表达那些字节 可能是 0x2 OR 0x34 OR 0xFF 的正确方式。 我是否以正确的方式编写了约束,或者我的思维过程完全错误?

求解器中的约束是隐含的合取,即您必须先构建析取,然后 s.add(...) 该析取。

i = 0
while (i < 8 * 4):
   s.add(Or(Extract(i + 7, i, bv) == 0x2), 
            Extract(i + 7, i, bv) == 0x34),
            Extract(i + 7, i, bv) == 0xFF)) 
i += 8