1
我努力讓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或2個結構數組元素,而不是2個結構指針,WP會成功。
那麼,指向struct的指針有什麼問題?
這一工程,但我仍然不知道WP如何驗證陣列版本'無效交換(雙*一,詮釋我,詮釋J)',這有同樣的問題。 –
在數組版本中,你只需要一個指針,所以你不能有分離問題,你能嗎? – Anne
如果'i'等於'j'那麼'a [i]'和'a [j]'是同一個對象。另外,WP對'int'的指針沒有問題... –