Z3 - 如何在 BitVec 上设置字节约束
Z3 - How to set a byte constraint on a BitVec
我正在尝试在 BitVec 中设置可能允许的字节列表,但我不确定我是否以正确的方式设置了约束。
例如:
让我们有一个名为 bv
的 32 位 BV 和一个名为 s
的 Solver()
:
s = Solver()
bv = BitVec(8 * 4)
我希望每个字节可以是 0x2
或 0x34
或 0xFF
所以我使用了 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
我正在尝试在 BitVec 中设置可能允许的字节列表,但我不确定我是否以正确的方式设置了约束。
例如:
让我们有一个名为 bv
的 32 位 BV 和一个名为 s
的 Solver()
:
s = Solver()
bv = BitVec(8 * 4)
我希望每个字节可以是 0x2
或 0x34
或 0xFF
所以我使用了 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