我安装了Frama-C Sodium(20150201)+ Jessie插件,我正在尝试重现ACSL参考手册中提供的示例。但是我不能使用Jessie库函数(比如\strlen
),因为每次我使用其中一个函数时,我都会遇到如下错误:
[kernel] user error: unbound function \strlen in annotation.
这是代码:
/*@
requires \base_addr(src) != \base_addr(dest);
requires \strlen(src) >= 0;
*/
char *strcpy ( char * dest , const char * src );
从bash启用frama-c
(使用-jessie
选项)无效。
答案 0 :(得分:2)
Frama-C实现目前不支持逻辑函数\strlen
。如果您下载ACSL 1.9 (Sodium implementation) 手册,您会看到该定义为红色,表示不支持。
相反,您可以尝试使用函数\strlen
替换strlen
,其公理定义在Frama-C安装的文件libc/__fc_string_axiomatic.h
中给出。为此,请务必在示例的开头添加#include <string.h>
。 (string.h
自动包含__fc_string_axiomatic.h
)
我在定义StrLen
的公理块strlen
的开头下方重现:
@ axiomatic StrLen {
@ logic ℤ strlen{L}(char *s);
@ // reads s[0..];
@
@ axiom strlen_pos_or_null{L}:
@ \forall char* s; \forall ℤ i;
@ (0 <= i
@ && (\forall ℤ j; 0 <= j < i ==> s[j] != '\0')
@ && s[i] == '\0') ==> strlen(s) == i;
@
@ axiom strlen_neg{L}:
@ \forall char* s;
@ (\forall ℤ i; 0 <= i ==> s[i] != '\0')
@ ==> strlen(s) < 0;
文件__fc_string_axiomatic.h
的大多数定义最初是为Jessie编写的,所以如果你提供足够强大的循环不变量,你应该能够证明你的strcpy
规范。 / p>
您可能还对文档ACSL by example感兴趣,该文档指定并证明了一些常见功能。