所以我進行了一些靜態代碼分析儀在一些C代碼,有一兩件事令我驚訝的是大約警告:的scanf%d段錯誤,在大的輸入
int val;
scanf("%d", &val);
其表示,對於足夠大的輸入可能導致段錯誤。當然,這可以發生。現在修復很簡單(指定一些寬度;畢竟我們知道有多少個有效整數可能最多取決於體系結構),但我想知道的是爲什麼這首先發生,爲什麼這不是在libc中沒有被視爲一個bug(並且是一個簡單的解決方法)?
現在我假設這種行爲有一些原因,首先我錯過了?
編輯:好吧,因爲這個問題似乎沒有這麼明確,更多的解釋: 沒有代碼分析器不會警告scanf一般,但有關scanf讀取沒有指定寬度的數字。
所以這裏有一個最小的工作示例:
#include <stdlib.h>
#include <stdio.h>
int main() {
int val;
scanf("%d", &val);
printf("Number not large enough.\n");
return 0;
}
我們可以通過發送一個巨大的數量得到了段錯誤(例如,使用的Python):
import subprocess
cmd = "./test"
p = subprocess.Popen(cmd, stdin=subprocess.PIPE, shell=True)
p.communicate("9"*50000000000000)
# program will segfault, if not make number larger
你的靜態代碼分析器偷看了'scanf'格式字符串還是隻是盲目地抱怨'scanf'? –
你使用了哪個程序? – ShinTakezou