尝试在python中使用z3分析一些C程序,并遇到指针问题。我正在使用以下术语:
float * buffer = (float*)malloc(5*sizeof(float))
我将缓冲区解释为BitVec(32)
值
因此*buffer
应为Real()
。
那应该没问题,但我应该为
*(buffer+3) or *(buffer+i)
如果我像
那样编入索引,应该如何写出断言*(buffer-1) or *(buffer+10)
答案 0 :(得分:3)
一种解决方案是将程序堆编码为从地点到值的地图H
。在Z3中,阵列理论可用于编码地图。
指针/地址是整数位置,整数算术编码指针算术;这将允许您的编码中的H(buffer + i) > 0
等约束。如果您要对OO语言进行编码,则可以使用该对(接收方,字段名称)对地址进行编码。例如。 H(r, f) > 0
对应r.f > 0
。请注意,此映射编码自然会考虑别名,例如:如果buffer1 == buffer2
和i == 3
则H(buffer1 + i) == H(buffer + 3)
。
请参阅文章Heaps and Data Structures: A Challenge for Automated Provers,了解基于地图的堆编码的有趣比较。
基于地图的编码通常由基于验证条件的工具使用,例如Frama-C,Dafny和Boogie。基于符号执行的工具,例如Silicon(Viper verification infrastructure的一部分)和VeriFast通常使用不同的编码;看,例如Heap-Dependent expressions in separation logic。