這些函數由於設計的時候比較淳朴,並沒有做任何的越界檢測,主要容易"被溢出",只需要多設點檢查邊界,即安全。
函數 | 嚴重性 | 解決方案 |
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 | 低危險 | 確保緩沖區大小與它所說的一樣大。 |