考虑以下C代码:
#include <assert.h>
//@ requires p < q;
void f(char *p, char *q)
{
assert(p <= q-1);
}
//@ requires a < b;
void g(int a, int b)
{
assert(a <= b-1);
}
使用alt-ergo,frama-c成功证明了g()
中的断言成立,但未能证明与f()
相同。为什么?
答案 0 :(得分:2)
形式上,指针和整数是两个非常不同的东西。特别地,C语义学指出,仅针对指向相同分配的块中的指针(或在所述分配的块的末端之后的一个偏移量)的指针,定义了指针比较。这反映在Frama-C的WP插件在addr_le
和朋友(请参阅$(frama-c -print-share-path)/wp/why3/Memory.why
)的定义中使用的模型中,该模型在比较之前检查指针的地址是否相同偏移量。