Я новичок в Frama-C, и у меня есть несколько вопросов относительно утверждений относительно указателей.
Рассмотрим фрагмент C ниже, включающий:
- две связанные структуры данных Data и Handle, s.t. Handle имеет указатель на данные;
- поле 'состояние' в данных, указывающее, завершена ли какая-либо гипотетическая операция
- три функции: init (), start_operation () и wait ();
- функция main (), использующая указанное выше и содержащая 6 утверждений (A1-A6)
Теперь, почему A5 и A6 не могут быть утверждены с помощью верификатора WP ("frama-c -wp file.c"). Разве они не должны выполняться из-за последнего предложения "гарантирует" в start_operation ()?
Что я делаю неправильно?
Лучший,
Эдуардо
typedef enum
{
PENDING, NOT_PENDING
} DataState;
typedef struct
{
DataState state;
int value;
} Data;
typedef struct
{
Data* data;
int id;
} Handle;
/*@
@ ensures \valid(\result);
@ ensures \result->state == NOT_PENDING;
@*/
Data* init(void);
/*@
@ requires data->state == NOT_PENDING;
@ ensures data->state == PENDING;
@ ensures \result->data == data;
@*/
Handle* start_operation(Data* data, int to);
/*@
@ requires handle->data->state == PENDING;
@ ensures handle->data->state == NOT_PENDING;
@ ensures handle->data == \old(handle)->data;
@*/
void wait(Handle* handle);
int main(int argc, char** argv)
{
Data* data = init();
/*@ assert A1: data->state == NOT_PENDING; */
Handle* h = start_operation(data,0);
/*@ assert A2: data->state == PENDING; */
/*@ assert A3: h->data == data; */
wait(h);
/*@ assert A4: h->data->state == NOT_PENDING; */
/*@ assert A5: data->state == NOT_PENDING; */
/*@ assert A6: h->data == data; */
return 0;
}