C中不安全的函式以解決辦法彙總

2021-09-26 09:23:14 字數 2494 閱讀 8787

這些函式由於設計的時候比較淳樸,並沒有做任何的越界檢測,主要容易"被溢位",只需要多設點檢查邊界,即安全。

針對不安全函式及其解決辦法的詳細描述

第 一位公共敵人是 gets()。永遠不要使用 gets()。該函式從標準輸入讀入使用者輸入的一行文字,它在遇到 eof 字元或換行字元之前,不會停止讀入文字。也就是:gets() 根本不執行邊界檢查。因此,使用 gets() 總是有可能使任何緩衝區溢位。作為乙個替代方法,可以使用方法 fgets()。它可以做與 gets() 所做的同樣的事情,但它接受用來限制讀入字元數目的大小引數,因此,提供了一種防止緩衝區溢位的方法。例如,不要使用以下**:

strcpy()函式將源字串複製到緩衝區。沒有指定要複製字元的具體數目。複製字元的數目直接取決於源字串中的數目。如果源字串碰巧來自使用者輸入,且沒有專門限制其大小,則有可能會陷入大的麻煩中!如果知道目的地緩衝區的大小,則可以新增明確的檢查:

strcat()函式非常類似於 strcpy(),除了它可以將乙個字串合併到緩衝區末尾。它也有乙個類似的、更安全的替代方法 strncat()。如果可能,使用 strncat() 而不要使用 strcat()。

函式 sprintf()和 vsprintf()是用來格式化文字和將其存入緩衝區的通用函式。它們可以用直接的方式模仿 strcpy() 行為。換句話說,使用 sprintf() 和 vsprintf() 與使用 strcpy() 一樣,都很容易對程式造成緩衝區溢位。

存在問題的函式及其解決方案

函式嚴重性解決方案

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 不安全函式告警

錯誤 詳細資訊 c4996 scanf this function or variable may be unsafe.consider using scanf s instead.to disable deprecation,use crt secure no warnings.vs2019使用更...

C語言中不安全的函式以及解決方案

函式 嚴重性 解決方案 gets 最危險 使用 fgets buf,size,stdin 這幾乎總是乙個大問題!strcpy 很危險改為使用 strncpy。strcat 很危險 改為使用 strncat。sprintf 很危險 改為使用 snprintf,或者使用精度說明符。scanf 很危險 使...

c語言不安全庫 C語言 那些不安全的庫函式

c語言 那些不安全的庫函式 c和c 不能夠自動地做邊界檢查,邊界檢查的代價是效率。一般來講,c 在大多數情況下注重效率。然而,獲得效率的代價是,c 程式設計師必須十分警覺以避免緩衝區溢位問題。c語言標準庫中的許多字串處理和io流讀取函式是導致緩衝區溢位的罪魁禍首。我們有必要了解這些函式,在程式設計中...