我是 Frama-C 的新手用户,对指针断言有一些疑问。
考虑以下涉及的 C 片段:
- 两个相关的数据结构Data和Handle,st Handle有一个指向Data的指针;
- 数据中的“状态”字段,指示某些假设操作是否已完成
- 三个函数:init()、start_operation() 和 wait();
- 使用上述方法的 main() 函数,并包含 6 个断言 (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;
}