在z3 [Python]

时间:2018-10-05 22:06:31

标签: python-3.x z3 z3py

我需要在z3中象征一个未知长度的字节字符串。我看到两个选项:象征每个必要的字节,然后在需要施加约束时连接字节,或者象征一个长字节串,在需要施加约束时提取部分。

一个长字节串似乎更方便,但是当需要大量数据时,需要调整其大小。 z3有办法做到这一点吗?

1 个答案:

答案 0 :(得分:1)

答案取决于调整大小的确切含义。

如果您的意思是要稍后更改现有位向量变量的大小,则可以使用其他方法;答案是“否”。一旦声明了具有一定位向量大小(或与此有关的任何类型)的变量,就无法在以后进行更改。

但是,如果您的意思是是否可以从旧的变量创建一个新变量;好的。

要扩展:您可以根据需要将2的补码数或无符号位向量考虑为任何新的更大大小,而进行符号扩展或零扩展。 (使用Concat扩展为0或原始符号的符号位。请参见此处:https://z3prover.github.io/api/html/namespacez3py.html#a4dfadd3cb36aaa827c9202a949a506a4

要缩小,您可以使用Extracthttps://z3prover.github.io/api/html/namespacez3py.html#a40e9429ef16134a6d9914ecdc2182e8c,方法是根据需要提取任意段。

请注意,在所有情况下,都必须具体知道新的大小。在下面的线程中,有关于这种情况的一些讨论:Z3 BitVec extraction using symbolic high and low最重要的是,SMTLib位向量逻辑是关于固定大小的位向量的,因此必须具体知道其大小(关于位向量的大小)。

但是,为了强调原始点,扩展或缩小位向量只会创建一个新值,该值与旧值(符号或其他)具有相同的值,并假定该值适合新的表示形式。 (否则,您将得到模数截断。)但更重要的是,原始变量和所有依赖的表达式 not 均受此更改的影响;您只是在创建一个新的位向量。从这种意义上说,在SMT领域根本无法调整现有位向量变量的大小。