Z3中的简单字节数组(SMT)

时间:2015-09-28 08:43:31

标签: z3 smt

我尝试用一​​个简单的例子来检查固定数组中的字节。我还阅读了Z3教程,但我无法使其正常工作。以下是可能的情况:

我有固定的字节数组,长度为16:T(16)

我有这些条件要检查:

A = (T(16) + 1) And 0x0F
T(A) = 0x76
0x01 <= A <= 0x7F

表示从T(16)添加1获取字节,使AND设为0x0F,并将结果编号分配给变量A。 现在检查位置T A中的数组T(A)是否为数字0x76。此外,A可以介于值0x010x7F之间。

这些条件在数组中的更多位置重复,但我需要让它适用于第一种情况。这样做的目的是:根据给定的方程式找到固定数组中已知字节的正确顺序。

我尝试使用此脚本但不起作用。

  

错误:运算符应用于错误排序的参数。

(declare-const t (Array Int Int))
(declare-const a Int)
; A = (t(16) + 1) And 0x0F
(assert (= a (bvand (+ (select t 16) 1) #x0F)))
; t(A) = 0x76
(assert (= (select t a) #x76))
(check-sat)
;(get-model)

示例:

T(16)上的

值为0x14,+ 1 = 0x15AND 0x0F = 0x05T(0x05)上应为是值0x76

谢谢。

1 个答案:

答案 0 :(得分:0)

你不能混合这样的整数和位向量,没有必要。在所有情况下都使用大小为8的bitvectors。请勿使用Int

除此之外,这将有效。

您可能会发现不使用数组但只有bitvectors更快。这是可以试验的东西。