Z3 (SMT) 中的简单字节数组
Simple byte array in Z3 (SMT)
我试着做一个简单的例子来检查固定数组中的字节。我也阅读了 Z3 教程,但无法正常工作。这是可能的情况:
我有长度为 16 的固定字节数组:T(16)
我要检查这些条件:
A = (T(16) + 1) And 0x0F
T(A) = 0x76
0x01 <= A <= 0x7F
意思是从T(16)
中取出字节加上1
,用0x0F
做成AND
,然后把结果编号赋值给变量A
。
现在检查数组 T
中的位置 A
T(A)
是否为数字 0x76
。 A
也可以在值 0x01
和 0x7F
之间。
这些条件在数组中的更多位置重复,但我需要让它在第一种情况下工作。这样做的目的是:根据给定的方程在固定数组中找到已知字节的正确顺序。
我用这个脚本试了一下,但没用。
Error: operator is applied to arguments of the wrong sort.
(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 = 0x15
,AND
0x0F
= 0x05
,在 T(0x05)
应该是值 0x76
.
谢谢。
你不能那样混合整数和位向量,也没有必要。在所有情况下都使用大小为 8 的位向量。不要使用 Int
.
除此之外,这也行得通。
您可能会发现不使用数组而只使用位向量更快。这是要试验的东西。
我试着做一个简单的例子来检查固定数组中的字节。我也阅读了 Z3 教程,但无法正常工作。这是可能的情况:
我有长度为 16 的固定字节数组:T(16)
我要检查这些条件:
A = (T(16) + 1) And 0x0F
T(A) = 0x76
0x01 <= A <= 0x7F
意思是从T(16)
中取出字节加上1
,用0x0F
做成AND
,然后把结果编号赋值给变量A
。
现在检查数组 T
中的位置 A
T(A)
是否为数字 0x76
。 A
也可以在值 0x01
和 0x7F
之间。
这些条件在数组中的更多位置重复,但我需要让它在第一种情况下工作。这样做的目的是:根据给定的方程在固定数组中找到已知字节的正确顺序。
我用这个脚本试了一下,但没用。
Error: operator is applied to arguments of the wrong sort.
(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 = 0x15
,AND
0x0F
= 0x05
,在 T(0x05)
应该是值 0x76
.
谢谢。
你不能那样混合整数和位向量,也没有必要。在所有情况下都使用大小为 8 的位向量。不要使用 Int
.
除此之外,这也行得通。
您可能会发现不使用数组而只使用位向量更快。这是要试验的东西。