【问题标题】:Simple byte array in Z3 (SMT)Z3中的简单字节数组(SMT)
【发布时间】:2015-12-25 10:53:08
【问题描述】:

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

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

我有这些条件要检查:

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

意思是从T(16) 中取字节加上1,使AND0x0F,并将结果编号分配给变量A。 现在检查数组T 中位置A T(A) 是否是数字0x76A 也可以介于值 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

谢谢。

【问题讨论】:

    标签: z3 smt


    【解决方案1】:

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

    除此之外,这将起作用。

    您可能会发现不使用数组而只使用位向量会更快。这是要试验的东西。

    【讨论】:

    • 谢谢,是的,关于类型,你是对的。关于不使用数组的想法 - 我可以创建 16 个 BitVec 变量......但是我如何读取 X 位置的值?案例:T(A) = 0x76,也许是某种选择案例?如果 A = 1 则使用 T1,如果 A = 2 使用 T2 变量?因为 X 是未知的......
    • 类似i == 0 ? x0 : i == 1 ? x1 : ...。这很尴尬,但比使用数组更快,因为这迫使 Z3 使用更通用的求解器。
    • 关于i == 0 ? x0 ... 这可以通过 if-then-else 命令 ite 来写?例如,从我们的值 T0,T1..(assert (= X (ite (= A 0) T0 (ite (= A 1) T1 T2))) ) 中分配给值 X N-th 值 .... 但这将是一个很长的表达式 ...(我只写了 16 中的前 2 个值,作为示例)跨度>
    • 是的,为此使用 ITE,是的,它是一个深链。不过,有一种更有效的编码方式。您创建一个新变量result,然后断言i == 0 implies result == x0 &amp;&amp; i == 1 implies result == x1 &amp;&amp; ... 等。这在实践中要快得多。我希望 Z3 不需要这种解决方法...
    • 我最终得到了这个脚本:pastebin.com/9myuJaYV(不适合这里,所以我把它放到了 pastebin)但我仍然得到 UNKNOWN 结果。我想我有一些蹩脚的错误或定义......或者我做错了什么:(
    猜你喜欢
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 2021-04-07
    • 1970-01-01
    相关资源
    最近更新 更多