我正在尝试在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 */
答案 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中。