c - 你将如何在 z3 中实现指针的取消引用

标签 c z3 z3py

试图在 python 中用 z3 分析一些 C 程序,并遇到了指针的麻烦。我正在使用以下术语:

float * buffer = (float*)malloc(5*sizeof(float))

我将缓冲区解释为 BitVec(32) 值 所以 *buffer 应该是 Real()。 那应该没问题,但是我应该为像

这样的术语写什么断言
*(buffer+3) or *(buffer+i) 

如果我像这样索引出来,应该如何编写断言

*(buffer-1) or *(buffer+10)

最佳答案

一种解决方案是将程序堆编码为从位置到值的映射H。在Z3中,数组理论可以用来对 map 进行编码。

指针/地址是整数位置,整数算术编码指针算术;这将在您的编码中允许诸如 H(buffer + i) > 0 之类的约束。如果您要对一种 OO 语言进行编码,则可以使用该对 (接收方、字段名称) 来对地址进行编码。例如。 H(r, f) > 0 将对应于 r.f > 0。请注意,此 map 编码自然会考虑别名,例如如果 buffer1 == buffer2i == 3H(buffer1 + i) == H(buffer + 3)

参见论文 Heaps and Data Structures: A Challenge for Automated Provers对基于映射的堆编码进行有趣的比较。

基于 map 的编码通常由基于验证条件的工具使用,例如 Frama-C , DafnyBoogie .基于符号执行的工具,如Silicon (这是 Viper verification infrastructure 的一部分)和 VeriFast通常使用不同的编码;看,例如Heap-Dependent expressions in separation logic .

关于c - 你将如何在 z3 中实现指针的取消引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45690728/

相关文章:

optimization - Z3 优化超时

c - mpi.h : Using a type w/o defining it?

C 查找静态数组大小

c - C语言中的Z3数组不是python

python - 使用符号高和低的 Z3 BitVec 提取

arrays - 关于 Z3 中数组的约束

c - 实时捕捉上的 Pcap 魔数

c - 堆栈大小会在运行时增长吗?

z3 - 将公式转换为 CNF

python - 使用 Z3 求解器求解长度为任意大小数组的条件