Frama-C非终止评估

时间:2014-05-21 18:06:24

标签: frama-c

我正在尝试在printf调用上切片以下程序:

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char **argv) {

  if (argc < 3) return 1;

  int x = atoi(argv[1]);
  int y = atoi(argv[2]);

  printf("%d %d\n", x, y);

  return 0;
}

但是,Value Analysis插件提供以下消息:

  

foo.c:9:[value]评估函数调用表达式参数时不终止           (char const (argv + 2),

并且切片的程序是空的!这是Frama-C中的错误/功能吗?或者我做错了什么?

这是一个完整的痕迹:

$ frama-c -slice-calls printf foo.c -then-on 'Slicing export' -print
[slicing] slicing requests in progress...
[kernel] preprocessing with "gcc -C -E -I.  foo.c"
[value] Analyzing a complete application starting at main
[value] Computing initial state
[value] Initial state computed
[value] Values of globals at initialization
foo.c:8:[kernel] warning: out of bounds read. assert \valid(argv+1);
[value] computing for function atoi <- main.
        Called from foo.c:8.
[kernel] warning: No code for function atoi, default assigns generated
[value] Done for function atoi
foo.c:9:[kernel] warning: out of bounds read. assert \valid(argv+2);
foo.c:9:[value] Non-termination in evaluation of function call expression argument
        (char const *)*(argv + 2)
[value] Recording results for main
[value] done for function main
[slicing] making slicing project 'Slicing'...
[slicing] interpreting slicing requests from the command line...
[slicing] applying all slicing requests...
[slicing] applying 0 actions...
[slicing] exporting project to 'Slicing export'...
[slicing] applying all slicing requests...
[slicing] applying 0 actions...
[sparecode] remove unused global declarations from project 'Slicing export tmp'
[sparecode] removed unused global declarations in new project 'Slicing export'
/* Generated by Frama-C */

1 个答案:

答案 0 :(得分:2)

参见value analysis manual 5.2.3对未完整申请的分析

  

对于指针类型的变量,分析器无法进行   猜测指针是否应该被指向一个指针   元素或指向数组的开头 - 或者实际上,在   数组的中间,这意味着它是合法的   此指针的负偏移量。默认情况下,指针类型为   假设指向两个元素数组的开头。这个   可以使用选项-context-width更改号码。示例:如果   入口点的原型是void main(int *t),分析器   假设t指向数组int S_t[2]

这同样适用于程序的argv函数的参数main()。 构建一个正确的指针数组,您希望在实践中对应main()个参数,如本手册其他部分所述(例如main_2.c第23页)。如果您只打算在0到1000范围内对格式良好的整数进行验证或切片,则可以在分配/*@ assert 0 <= x <= 1000 ; */后在程序中插入x

  

[kernel]警告:没有函数atoi的代码,默认分配生成的

您还应该阅读同一手册中的 2.3.3缺少功能。告诉你什么,首先阅读手册,然后尝试使用值分析和切片插件。对于现在的软件来说,这是一个陡峭的学习曲线,但这确实是如何使用的。

无论如何,应为分析仪遇到的所有功能提供实现或最小规范。最新版本的Frama-C在share / libc中包含了许多标准函数的相当不错的规范,这些函数可能已安装在您计算机上的/ usr / local / lib / Frama-C / libc中。