Frama-C \ strlen函数

时间:2015-08-04 18:25:56

标签: c string strlen frama-c

我安装了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选项)无效。

1 个答案:

答案 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感兴趣,该文档指定并证明了一些常见功能。