你将如何在z3中实现指针的解引用

时间:2017-08-15 10:05:56

标签: 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)

1 个答案:

答案 0 :(得分:3)

一种解决方案是将程序堆编码为从地点到值的地图H。在Z3中,阵列理论可用于编码地图。

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

请参阅文章Heaps and Data Structures: A Challenge for Automated Provers,了解基于地图的堆编码的有趣比较。

基于地图的编码通常由基于验证条件的工具使用,例如Frama-CDafnyBoogie。基于符号执行的工具,例如SiliconViper verification infrastructure的一部分)和VeriFast通常使用不同的编码;看,例如Heap-Dependent expressions in separation logic