Frama-c不能证明`char *`以外类型的缓冲区指针的有效性

时间:2018-08-14 12:28:53

标签: pointers frama-c

考虑以下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))成立的明显事实。为什么?

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,并且绝对没有将freada绑在一起。

我倾向于将其视为错误,但我不是WP内部的专家。您可能要在Frama-C's BTS上进行举报。