有没有等同于 C++ 中的地图的 z3 容器?

is there a z3 container that is equivalent to a map in C++?

我正在从事一个逆向工程项目,要求我对汇编代码执行反向切片。对于给定汇编代码函数中的给定汇编代码寄存器,我想检测汇编函数内执行更新该寄存器的操作的所有指令。长话短说,我将这些指令的操作表示为 z3 表达式,例如

sub r2 r2 10
add r1 r2 3 

寄存器r1表示为(bvadd #x0000000d r2))。但是对于像这样的 ldr 指令的情况

ldr r2,[r2, #13]
add r1 r2 3

我想将内存表示为将 z3 表达式作为键和值的映射,因此 ldr 指令应该是 (z3_ctx.select(mem, i)) 形式的 z3 表达式只是现在我想要一个映射而不是 z3 中的数组

所以我的问题是如何在 z3 中构造一个映射,其键和值是 z3 表达式,因为我想将来自该映射的加载操作表示为类似于 (z3_ctx.select(mem, i)) 的 z3 表达式array 只有现在 i 本身是一个 z3 表达式 (bvadd #x0000000d r2)

从位向量到位向量的 SMTLib 数组可以很好地解决这个问题。从 API 的角度来看,在 SMT 求解中 maparray 之间没有区别:您使用位向量来解决它,就像您想要做的那样。

您的消息表明您担心无法使用 z3 表达式“寻址”数组?这不是真的。从位向量到位向量的数组可以用正确位向量类型的任意 z3 表达式寻址。

如果您尝试了上述 运行 问题,post 给您错误的代码。否则,它应该可以正常工作。 (话虽如此,这并不意味着它将是“高性能的”。从性能的角度来看,内存通常是求解器的软肋;但这完全是另一个话题。)