1
我试着举一个简单的例子来检查固定数组中的字节。我也读了Z3的教程,但我无法得到它的工作。这里是5月情形:Z3中的简单字节数组(SMT)
我有固定字节数组16的长度:T(16)
我具备这些条件的检查:
A = (T(16) + 1) And 0x0F
T(A) = 0x76
0x01 <= A <= 0x7F
它意味着从T(16)
采取字节添加1
,使AND
与0x0F
,并将结果编号分配给变量A
。 现在检查上的位置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
。
谢谢。
谢谢,是的,你是对的类型。关于不使用数组的想法 - 我可以创建16个BitVec变量......但我怎么读取X位置的值?案例:T(A)= 0x76,也许某种** Select Case **?如果A = 1那么使用T1,如果A = 2使用T2变量?因为X是未知的... –
有点像'i == 0? x0:i == 1? x1:...'。这很尴尬,但可以比使用阵列更快,因为这会迫使Z3使用更通用的求解器。 – usr
关于'i == 0? x0' ...这可以通过if-then-else命令** ite **写入。例如,从我们的值T 0,T 1 ... '(assert(= X(ite(= A 0)T 0(ite(= A 1)T 1 T 2))))...'中赋值为第N个值。但这将是非常长的表达式......(我只写了16个前两个值,就如同例子) –