考虑以下C代码:
#include <stdio.h>
/*@
requires \valid(p+(0..n-1));
requires \valid(fp);
*/
void f(/*unsigned*/ char *p, size_t n, FILE *fp)
{
fread(p, 1, n, fp);
}
Frama-c可以证明满足fread
的前提。但是,在还原unsigned
之后,frama-c无法看到\valid((char*)p+(0..n-1))
成立的明显事实。为什么?
答案 0 :(得分:0)
在unsigned char *
的前提下,从f
中的char *
到fread
的转换似乎使Frama-C的WP插件感到困惑。使用-wp-out foo
获取目录foo/
中提供给外部专家的文件时,我得到了Alt-Ergo语法的以下目标:
goal f_call_fread_pre_valid_ptr_block:
forall i : int.
forall t : int farray.
forall t_1 : (addr,int) farray.
forall a_2,a_1,a : addr.
(region(a_1.base) <= 0) ->
(region(a_2.base) <= 0) ->
linked(t) ->
sconst(t_1) ->
is_uint32(i) ->
valid_rw(t, a_2, 2) ->
valid_rw(t, shift_uint8(a_1, 0), i) ->
valid_rw(t, shift_sint8(a, 0), i)
请特别注意,假设(即requires
的{{1}}提到变量f
,而目标(即a_1
的{{1}}我们试图证明),提到变量requires
,并且绝对没有将fread
和a
绑在一起。
我倾向于将其视为错误,但我不是WP内部的专家。您可能要在Frama-C's BTS上进行举报。