我正在尝试使用值分析来分析一些类似于以下内容的程序:
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
答案 0 :(得分:3)
感谢anol的评论,我能够在价值分析(http://frama-c.com/download/frama-c-value-analysis.pdf)的用户手册中找到相关部分。
以下是摘录:
5.2.4调整自动生成初始值(p58)
(...)
对于指针类型的变量,分析器无法猜测是否为指针 应假设指向单个元素或指向开头 一个数组 - 或者实际上,在数组的中间,这意味着它是合法的 这个指针的负偏移。
默认情况下,假定指针类型指向两个元素的数组的开头。 可以使用选项更改此编号 -context宽度。