Frama-c无法证明有关指针比较的事实

时间:2018-08-14 09:20:10

标签: frama-c

考虑以下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()相同。为什么?

1 个答案:

答案 0 :(得分:2)

形式上,指针和整数是两个非常不同的东西。特别地,C语义学指出,仅针对指向相同分配的块中的指针(或在所述分配的块的末端之后的一个偏移量)的指针,定义了指针比较。这反映在Frama-C的WP插件在addr_le和朋友(请参阅$(frama-c -print-share-path)/wp/why3/Memory.why)的定义中使用的模型中,该模型在比较之前检查指针的地址是否相同偏移量。