我有一个问题,指定对内部状态变量的访问,即仅由getter和setter访问的模块本地变量。我试图在setter函数的函数契约规范中使用getter函数,但frama -c返回错误:
> frama-c -wp -wp-rte -verbose 0 intstate.c intstate.h
...
intstate.h:4:[kernel] user error: unexpected token ')'
[kernel] user error: skipping file "intstate.c" that has errors.
[kernel] Frama-C aborted: invalid user input.
以下是标题:
int get_state(void);
/*@
@ ensures val == get_state();
@*/
void set_state(int val);
这里的来源:
#include "intstate.h"
static int the_state = 0;
int get_state(void) {
return the_state;
}
void set_state(int val) {
the_state = val;
}
我认为这是一个常见问题。如何在ACSL中完成?有没有人有类似问题的例子?
我使用Frama-C Fluorine-20130601。
提前致谢
谢
修改 重新阅读ACSL规范更密切地向我透露,C函数在规范中是不可能的,只有逻辑函数。我试图将C函数包装在一个逻辑函数中但是也没有被接受,同样的错误信息。我最终通过ghost变量对interanl状态变量建模,但我不确定这是不是很好的方法。