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

Frama-c fails to prove fact about pointer comparison

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

形式上,指针和整数是两种截然不同的东西。特别是,C 语义声明指针比较仅针对指向同一分配块(或超出所述分配块末尾的一个偏移量)的指针进行了明确定义。这反映在 Frama-C 的 WP 插件在 addr_le 和朋友(参见 $(frama-c -print-share-path)/wp/why3/Memory.why)的定义中使用的模型中,在完成比较之前检查指针是否具有相同的地址在他们的偏移量上。