Frama-c值分析中的位置无效

时间:2017-01-26 12:13:43

标签: frama-c

我正在尝试使用值分析来分析一些类似于以下内容的程序:

int main(int argc, char **argv){
  char *argv0 = argv[0];
  char x = argv0[1];
  char y = argv0[2];
  return 0;
}

在规范化和分析之后,程序看起来像:

int main(int argc, char **argv){
  int __retres;
  char *argv0;
  char x;
  char y;
  /*@ assert Value: mem_access: \valid_read(argv + 0); */
  argv0 = *(argv + 0);
  /*@ assert Value: mem_access: \valid_read(argv0 + 1); */
  x = *(argv0 + 1);
  /*@ assert Value: mem_access: \valid_read(argv0 + 2); */
  y = *(argv0 + 2);
  __retres = 0;
  return __retres;
}

其中前两个断言的状态为“未知”,第三个断言的状态为“无效”。此外,值分析告诉我*(argv0 + 2)是一个无效的位置,并将其后面的所有代码标记为死。

我想了解为什么最后一个断言无效(而不是前两个)以及为什么*(argv0 + 2)是无效的位置。

我正在使用Frama-c Silicon-20161101

1 个答案:

答案 0 :(得分:3)

感谢anol的评论,我能够在价值分析(http://frama-c.com/download/frama-c-value-analysis.pdf)的用户手册中找到相关部分。

以下是摘录:

  

5.2.4调整自动生成初始值(p58)

     

(...)

     

对于指针类型的变量,分析器无法猜测是否为指针   应假设指向单个元素或指向开头   一个数组 - 或者实际上,在数组的中间,这意味着它是合法的   这个指针的负偏移。

     

默认情况下,假定指针类型指向两个元素的数组的开头。   可以使用选项更改此编号   -context宽度。