我正在努力让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的问题是什么?
答案 0 :(得分:2)
这是因为您没有指定p
和q
无法指向相同的结构,因此WP无法猜测最后一项分配无法修改(*p)
。
您可以通过添加前提条件来执行您想要的操作:
requires \separated(p, q);