如何在 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,但我不清楚我们可以把它们放在哪里。
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,但我不清楚我们可以把它们放在哪里。