WP被指向struct的混淆

时间:2017-08-07 19:21:30

标签: frama-c

我正在努力让WP验证交换2个结构的函数的后置条件。

typedef struct { int x; int y; } pair;

/*@
    requires \valid({p, q});
    assigns *p, *q;
    ensures *p == \old(*q);
    ensures *q == \old(*p);
*/
void swap(pair *p, pair *q);

如果我在正文中添加一些断言,WP会验证除最后一个之外的所有断言,这与第一个断言相同!

void swap(pair *p, pair *q) {
    pair tmp = *p;

    *p = *q;
    //@ assert *p == \at(*q, Pre);

    *q = tmp;
    //@ assert *q == \at(*p, Pre);

    // WP is not sure anymore!
    //@ assert *p == \at(*q, Pre);
}

在Windows和Ubuntu上,Phosphorus-20170501都会出现这种情况。

注意,如果函数将2个指针交换为int,或者是struct的数组的2个元素,而不是2个指向struct的指针,则WP会成功。

那么,指向struct的问题是什么?

1 个答案:

答案 0 :(得分:2)

这是因为您没有指定pq无法指向相同的结构,因此WP无法猜测最后一项分配无法修改(*p)

您可以通过添加前提条件来执行您想要的操作:

requires \separated(p, q);