c語言中,大多數的緩衝區溢位問題可以直接追溯到標準c庫。罪魁禍首就是因為不進行自變數檢查的、有問題的字元操作(例如:strcpy()、strcat()、sprintf()、gets()等等)。一般來講,像「避免使用strcpy()」和「永遠不使用gets()」這樣嚴格的規則在工作中經常遇到。
函式嚴重性解決方案
gets
最危險使用 fgets(buf, size, stdin)。這幾乎總是乙個大問題!
strcpy
很危險改為使用 strncpy。
strcat
很危險改為使用 strncat。
sprintf
很危險改為使用 snprintf,或者使用精度說明符。
scanf
很危險使用精度說明符,或自己進行解析。
sscanf
很危險使用精度說明符,或自己進行解析。
fscanf
很危險使用精度說明符,或自己進行解析。
vfscanf
很危險使用精度說明符,或自己進行解析。
vsprintf
很危險改為使用 vsnprintf,或者使用精度說明符。
vscanf
很危險使用精度說明符,或自己進行解析。
vsscanf
很危險使用精度說明符,或自己進行解析。
streadd
很危險確保分配的目的地引數大小是源引數大小的四倍。
strecpy
很危險確保分配的目的地引數大小是源引數大小的四倍。
strtrns
危險手工檢查來檢視目的地大小是否至少與源字串相等。
realpath
很危險(或稍小,取決於實現)
分配緩衝區大小為 maxpathlen。同樣,手工檢查引數以確保輸入引數不超過 maxpathlen。
syslog
很危險(或稍小,取決於實現)
在將字串輸入傳遞給該函式之前,將所有字串輸入截成合理的大小。
getopt
很危險(或稍小,取決於實現)
在將字串輸入傳遞給該函式之前,將所有字串輸入截成合理的大小。
getopt_long
很危險(或稍小,取決於實現)
在將字串輸入傳遞給該函式之前,將所有字串輸入截成合理的大小。
getpass
很危險(或稍小,取決於實現)
在將字串輸入傳遞給該函式之前,將所有字串輸入截成合理的大小。
getchar
中等危險
如果在迴圈中使用該函式,確保檢查緩衝區邊界。
fgetc
中等危險
如果在迴圈中使用該函式,確保檢查緩衝區邊界。
getc
中等危險
如果在迴圈中使用該函式,確保檢查緩衝區邊界。
read
中等危險
如果在迴圈中使用該函式,確保檢查緩衝區邊界。
bcopy
低危險確保緩衝區大小與它所說的一樣大。
fgets
低危險確保緩衝區大小與它所說的一樣大。
memcpy
低危險確保緩衝區大小與它所說的一樣大。
snprintf
低危險確保緩衝區大小與它所說的一樣大。
strccpy
低危險確保緩衝區大小與它所說的一樣大。
strcadd
低危險確保緩衝區大小與它所說的一樣大。
strncpy
低危險確保緩衝區大小與它所說的一樣大。
vsnprintf
低危險確保緩衝區大小與它所說的一樣大。
c語言不安全庫 C語言 那些不安全的庫函式
c語言 那些不安全的庫函式 c和c 不能夠自動地做邊界檢查,邊界檢查的代價是效率。一般來講,c 在大多數情況下注重效率。然而,獲得效率的代價是,c 程式設計師必須十分警覺以避免緩衝區溢位問題。c語言標準庫中的許多字串處理和io流讀取函式是導致緩衝區溢位的罪魁禍首。我們有必要了解這些函式,在程式設計中...
c語言不安全庫 C語言 一些不安全的庫函式
那些不安全的庫函式 c 和 c 不能夠自動地做邊界檢查,邊界檢查的代價是效率。一般來講,c 在大多數情況下注重效率。然而,獲得效率的代價是,c 程式設計師必須十分警覺以避免緩衝區溢位問題。c語言標準庫中的許多字串處理和io流讀取函式是導致緩衝區溢位的罪魁禍首。我們有必要了解這些函式,在程式設計中多加...
C語言中不安全的函式以及解決方案
函式 嚴重性 解決方案 gets 最危險 使用 fgets buf,size,stdin 這幾乎總是乙個大問題!strcpy 很危險改為使用 strncpy。strcat 很危險 改為使用 strncat。sprintf 很危險 改為使用 snprintf,或者使用精度說明符。scanf 很危險 使...