我正在尝试在BitVec中设置可能允许的字节列表,但我不确定我是否正在以正确的方式设置约束。
E.g:
让我们拥有一个名为bv
的32位BV和一个名为Solver()
的{{1}}:
s
我希望每个字节可以是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()
。
我认为这不是表达那些字节可能是 0x2或0x34或0xFF 的正确方法。 我是否以正确的方式编写约束,或者我的思维过程是完全错误的?
答案 0 :(得分:2)
求解器中的约束隐含地是一个连词,即,你必须首先构建一个析取,然后再s.add(...)
这个析取。
答案 1 :(得分:1)
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