私はFrama-C版Silicon-20161101を使用しています。 ensure節にポインタ値*x
を参照するたびに、プリプロセッサは*\old(x)
を不必要に挿入します。Frama-Cプリプロセッサは、 oldをすべてのポインタ参照節に挿入します。
// File swap.c:
/*@ requires \valid(a) && \valid(b);
@ ensures A: *a == \old(*b) ;
@ ensures B: *\at(\old(b),Post) == \old(*a) ;
@ assigns *a,*b ;
@*/
void swap(int *a,int *b)
{
int tmp = *a ;
*a = *b ;
*b = tmp ;
return ;
}
興味深いことにframa-c swap.c -print
出力
/* Generated by Frama-C */
/*@ requires \valid(a) ∧ \valid(b);
ensures A: *\old(a) ≡ \old(*b);
ensures B: *\old(b) ≡ \old(*a);
assigns *a, *b;
*/
void swap(int *a, int *b)
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
return;
}
で処理した場合例えば、これはまだWPプラグインによって正しいと確認されました!これは、*\old(a)
が\old(a)
のポスト値(これは変更されていないので、まだ同じポインタです)であると仮定していますか?これはバグですか?このためのユーザーの最終的な修正はありますか?