2017-08-07 339 views
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的指針有什麼問題?

回答

2

這是因爲您沒有指定pq不能指向相同的結構,所以WP無法猜測最後一個分配不能修改(*p)

你可以做你想做的,加入的前提條件:

requires \separated(p, q); 
+0

這一工程,但我仍然不知道WP如何驗證陣列版本'無效交換(雙*一,詮釋我,詮釋J)',這有同樣的問題。 –

+1

在數組版本中,你只需要一個指針,所以你不能有分離問題,你能嗎? – Anne

+0

如果'i'等於'j'那麼'a [i]'和'a [j]'是同一個對象。另外,WP對'int'的指針沒有問題... –

相關問題