WP 被指向结构的指针弄糊涂了
WP confused by pointers to struct
我正在努力让 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);
}
Phosphorus-20170501 在 Windows 和 Ubuntu 上都会发生这种情况。
请注意,如果函数将 2 个指向 int 的指针或 struct 数组的 2 个元素而不是 2 个指向 struct 的指针交换,则 WP 会成功。
那么,指向结构的指针有什么问题?
这是因为你没有指定p
和q
不能指向同一个结构,所以WP猜不到最后的赋值不能修改(*p)
.
你可以通过添加前提条件来做你想做的事情:
requires \separated(p, q);
我正在努力让 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);
}
Phosphorus-20170501 在 Windows 和 Ubuntu 上都会发生这种情况。
请注意,如果函数将 2 个指向 int 的指针或 struct 数组的 2 个元素而不是 2 个指向 struct 的指针交换,则 WP 会成功。
那么,指向结构的指针有什么问题?
这是因为你没有指定p
和q
不能指向同一个结构,所以WP猜不到最后的赋值不能修改(*p)
.
你可以通过添加前提条件来做你想做的事情:
requires \separated(p, q);