frama-c wp 插件无法验证手册中的交换功能
frama-c wp plugin fails to validate the swap function from the manual
如何使 frama-c -wp
验证来自 wp manual 的示例 - 一个简单的 swap
函数 (swap.c):
/* @ requires \valid(a) && \valid(b);
@ ensures A: *a == \old(*b);
@ ensures B: *b == \old(*a);
@ assigns *a,*b;
@*/
void swap(int * a, int * b);
void swap(int * a, int * b) {
int tmp = * a;
*a = *b;
*b = tmp;
return ;
}
调用
$ frama-c -wp -wp-rte swap.c
给出:
[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing)
[kernel] Parsing swap.c (with preprocessing)
[wp] Running WP plugin...
[wp] Collecting axiomatic usage
[rte] annotating function swap
[wp] 4 goals scheduled
[wp] [Alt-Ergo] Goal typed_swap_assert_rte_mem_access_4 : Unknown (174ms)
[wp] [Alt-Ergo] Goal typed_swap_assert_rte_mem_access_2 : Unknown (160ms)
[wp] [Alt-Ergo] Goal typed_swap_assert_rte_mem_access : Unknown (154ms)
[wp] [Alt-Ergo] Goal typed_swap_assert_rte_mem_access_3 : Unknown (220ms)
[wp] Proved goals: 0 / 4
Alt-Ergo: 0 (unknown: 4)
不知道为什么
- 我的尝试与手册中的目标数量不同(4 对 9)?
- Alt-Ergo(事实上,
cvc3
、gappa
、simplify
、verit
、yices
、none、z3
) 无法放弃这 4 项证明义务中的任何一项?
我使用最新的 OPAM 安装:
frama-c
:钠-20150201
alt-ergo
: 0.95.2(来自 ubuntu 14.04 主存储库包 alt-ergo
)
why3
: 0.86.1
证明义务的示例,由 wp
传递给 alt-ergo
:
goal swap_assert_rte_mem_access:
forall t : int farray.
forall a_1,a : addr.
linked(t) ->
(region(a.base) <= 0) ->
(region(a_1.base) <= 0) ->
valid_rd(t, a, 1)
您从 WP 手册中复制 swap
的规范时犯了一个错误。 (下一个版本将使用允许复制粘贴的字体。)C 注释的开头和 ACSL 规范中的 @
之间不能有 space;否则评论被解释为简单的评论。因此,您实际上是在尝试证明
void swap(int * a, int * b);
void swap(int * a, int * b) {
int tmp = * a;
*a = *b;
*b = tmp;
return ;
}
这当然是不可能的,因为 a
和 b
可能不是有效的指针。
正确的规格是
/*@ requires \valid(a) && \valid(b);
@ ensures A: *a == \old(*b);
@ ensures B: *b == \old(*a);
@ assigns *a,*b;
@*/
void swap(int * a, int * b);
在小示例上使用 Frama-C 时,您可能应该使用 GUI 界面 (frama-c-gui
)。这样,您将看到规范化后的源代码、添加了哪些 RTE 等。
如何使 frama-c -wp
验证来自 wp manual 的示例 - 一个简单的 swap
函数 (swap.c):
/* @ requires \valid(a) && \valid(b);
@ ensures A: *a == \old(*b);
@ ensures B: *b == \old(*a);
@ assigns *a,*b;
@*/
void swap(int * a, int * b);
void swap(int * a, int * b) {
int tmp = * a;
*a = *b;
*b = tmp;
return ;
}
调用
$ frama-c -wp -wp-rte swap.c
给出:
[kernel] Parsing FRAMAC_SHARE/libc/__fc_builtin_for_normalization.i (no preprocessing)
[kernel] Parsing swap.c (with preprocessing)
[wp] Running WP plugin...
[wp] Collecting axiomatic usage
[rte] annotating function swap
[wp] 4 goals scheduled
[wp] [Alt-Ergo] Goal typed_swap_assert_rte_mem_access_4 : Unknown (174ms)
[wp] [Alt-Ergo] Goal typed_swap_assert_rte_mem_access_2 : Unknown (160ms)
[wp] [Alt-Ergo] Goal typed_swap_assert_rte_mem_access : Unknown (154ms)
[wp] [Alt-Ergo] Goal typed_swap_assert_rte_mem_access_3 : Unknown (220ms)
[wp] Proved goals: 0 / 4
Alt-Ergo: 0 (unknown: 4)
不知道为什么
- 我的尝试与手册中的目标数量不同(4 对 9)?
- Alt-Ergo(事实上,
cvc3
、gappa
、simplify
、verit
、yices
、none、z3
) 无法放弃这 4 项证明义务中的任何一项?
我使用最新的 OPAM 安装:
frama-c
:钠-20150201alt-ergo
: 0.95.2(来自 ubuntu 14.04 主存储库包alt-ergo
)why3
: 0.86.1
证明义务的示例,由 wp
传递给 alt-ergo
:
goal swap_assert_rte_mem_access:
forall t : int farray.
forall a_1,a : addr.
linked(t) ->
(region(a.base) <= 0) ->
(region(a_1.base) <= 0) ->
valid_rd(t, a, 1)
您从 WP 手册中复制 swap
的规范时犯了一个错误。 (下一个版本将使用允许复制粘贴的字体。)C 注释的开头和 ACSL 规范中的 @
之间不能有 space;否则评论被解释为简单的评论。因此,您实际上是在尝试证明
void swap(int * a, int * b);
void swap(int * a, int * b) {
int tmp = * a;
*a = *b;
*b = tmp;
return ;
}
这当然是不可能的,因为 a
和 b
可能不是有效的指针。
正确的规格是
/*@ requires \valid(a) && \valid(b);
@ ensures A: *a == \old(*b);
@ ensures B: *b == \old(*a);
@ assigns *a,*b;
@*/
void swap(int * a, int * b);
在小示例上使用 Frama-C 时,您可能应该使用 GUI 界面 (frama-c-gui
)。这样,您将看到规范化后的源代码、添加了哪些 RTE 等。