如何在 Frama-C 中调用关于 libc 字符串函数的公理?

How do I invoke axioms about libc string functions in Frama-C?

Frama-C 在 __fc_string_axiomatic.h 头文件中为来自 C 标准库的字符串函数提供公理规范。 例如,一个这样的条目指定 memset() 读取:

/*@ axiomatic MemSet {
  @ logic  memset{L}(char *s, ℤ c, ℤ n)
  @   reads s[0..n - 1];
  @ // Returns [true] iff array [s] contains only character [c]
  @
  @ axiom memset_def{L}:
  @   \forall char *s; \forall ℤ c; \forall ℤ n;
  @      memset(s,c,n) <==> \forall ℤ i; 0 <= i < n ==> s[i] == c;
  @ }
  @*/

在我自己的带注释的 C 文件中,我试图利用 memset() 的公理规范如下:

int n = strlen(argv[1]);
//@ assert n >= 0;
char dest[n+1];
//@ assert \valid(dest+ (0..n));
//@ assert \valid(argv[1]+ (0..n));


memset(dest,0,n+1);
//@ assert \forall integer k; 0 <= k < n+1 ==> dest[k] == 0;

虽然最后的断言似乎是 memset_def 中谓词的直接替代,并且 Frama-C 确实评估了上面显示的 axiomatic,但 Alt-Ergo 未能证明这一点断言。我对验证 C 标准库本身不感兴趣;我的问题是:如何强制 Frama-C 在我自己的断言中调用该公理?

你的断言立即被证明,例如。 Z3 4.4.1,但确实不是 Alt-Ergo。因此,问题在于 Alt-Ergo 用于解决目标的策略,而不在于 Frama-C 生成的内容。一种可能性是添加触发器来帮助 Alt-Ergo,但我不清楚我们可以把它们放在哪里。