Я использую версию Frama-C Silicon-20161101. Каждый раз, когда ссылка указывает значение указателя *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)
(которое по-прежнему остается тем же самым указателем, поскольку оно не было изменено)? Это ошибка? Есть ли какое-нибудь быстрое исправление для пользователя?