[英]Invalid location in Frama-c value analysis
我正在嘗試使用值分析來分析類似於以下內容的某些程序:
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
感謝anol的評論,我能夠在Value Analysis用戶手冊( http://frama-c.com/download/frama-c-value-analysis.pdf )中找到相關部分。
這是摘錄:
5.2.4調整自動生成初始值(p58)
(......)
對於指針類型的變量,分析器無法猜測是應該將指針假定為指向單個元素還是指向數組的開頭,或者實際上是位於數組的中間,這意味着取該指針的負偏移量是合法的。
默認情況下,假定指針類型指向兩個元素數組的開頭 。 可以使用選項-context-width更改此數字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.