私はFrama-Cの初心者ユーザーであり、ポインターに対するアサーションに関していくつか質問があります。
以下のCフラグメントについて考えてみます。
- 2つの関連するデータ構造DataとHandle、stHandleにはDataへのポインターがあります。
- いくつかの架空の操作が完了したかどうかを示すデータの「状態」フィールド
- 3つの関数:init()、start_operation()、wait();
- 上記を使用し、6つのアサーションを含むmain()関数(A1-A6)
さて、なぜA5とA6はWPベリファイア( "frama-c -wp file.c")でアサートできないのですか?start_operation()の最後の "ensures"句のために保持されるべきではありませんか?
私は何が間違っているのですか?
一番、
エドゥアルド
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;
}