Z3:如何从8位数组中选择4个字节?

时间:2013-04-10 13:16:03

标签: python z3

使用Python Z3,我有一个字节数组,可以使用Select来读取1个字节,如下所示。

MI = BitVecSort(32)
MV = BitVecSort(8)
Mem = Array('Mem', MI, MV)

pmt = BitVec('pmt', 32)
pmt2 = BitVec('pmt2', 8)

g = True
g = And(g, pmt2 == Select(Mem, pmt))

到目前为止,这没关系。但是,现在我想读取Mem数组中的4个字节,如下所示。

t3 = BitVec('t3', 32)
g = And(g, t3 == Select(Mem, pmt))

结果证明这是错误的,因为t3是32位而不是8位,而Mem是8位数组。

问题是:如何在上面的例子中使用Select来读出4个字节,而不是1个字节?

我想我可以创建一个新函数来读出4个字节,比如说Select4(),但我不知道如何在Z3 python中创建一个函数。

非常感谢你!

1 个答案:

答案 0 :(得分:2)

我们可以将Select4定义为

def Select4(M, I):
  return Concat(Select(M, I + 3), Select(M, I + 2), Select(M, I+1), Select(M, I))

操作Concat实际上附加了四个位向量。 Z3还支持操作Extract。这两个操作可用于编码编程语言(如C。

)中可用的强制转换操作

以下是完整示例(也可在线提供here):

MI = BitVecSort(32)
MV = BitVecSort(8)
Mem = Array('Mem', MI, MV)

pmt = BitVec('pmt', 32)
pmt2 = BitVec('pmt2', 8)

def Select4(M, I):
  return Concat(Select(M, I + 3), Select(M, I + 2), Select(M, I+1), Select(M, I))

g = True
g = And(g, pmt2 == Select(Mem, pmt))
t3 = BitVec('t3', 32)
g = And(g, t3 == Select4(Mem, pmt))

solve(g, pmt2 > 10)