c 和 c++ 不能夠自動地做邊界檢查,邊界檢查的代價是效率。一般來講,c 在大多數情況下注重效率。然而,獲得效率的代價是,c 程式設計師必須十分警覺以避免緩衝區溢位問題。
c語言標準庫中的許多字串處理和io流讀取函式是導致緩衝區溢位的罪魁禍首。我們有必要了解這些函式,在程式設計中多加小心。
strcpy()strcpy() 函式將源字串複製到緩衝區。沒有指定要複製字元的具體數目!如果源字串碰巧來自使用者輸入,且沒有專門限制其大小,則有可能會造成緩衝區溢位!
我們也可以使用strncpy來完成同樣的目的:
strncpy (dst, src, dst_size-1);
如果 src 比 dst 大,則該函式不會丟擲乙個錯誤;當達到最大尺寸時,它只是停止複製字元。注意上面呼叫 strncpy() 中的 -1。如果 src 比 dst 長,則那給我們留有空間,將乙個空字元放在 dst 陣列的末尾。
但是! strncpy()也不完全安全,也有可能把事情搞糟。即使「安全」的呼叫有時會留下未終止的字串,或者會發生微妙的相差一位錯誤。
確保 strcpy() 不會溢位的另一種方式是,在需要它時就分配空間,確保通過在源字串上呼叫 strlen() 來分配足夠的空間
。
dst = (char *)malloc(strlen(src));
strcpy(dst, src);
strcat()strcat() 函式非常類似於 strcpy(),除了它可以將乙個字串合併到緩衝區末尾。它也有乙個類似的、更安全的替代方法 strncat()。如果可能,使用 strncat() 而不要使用 strcat()。
sprintf()、vsprintf函式 sprintf() 和 vsprintf() 是用來格式化文字和將其存入緩衝區的通用函式。它們可以用直接的方式模仿 strcpy() 行為。換句話說,使用 sprintf() 和 vsprintf() 與使用 strcpy() 一樣,都很容易對程式造成緩衝區溢位。
sprintf() 的許多版本帶有使用這種函式的更安全的方法。可以指定格式字串本身每個自變數的精度。sprintf 採用」 * 」來占用乙個本來需要乙個指定寬度或精度的常數數字的位置,而實際的寬度或精度就可以和其它被列印的變數一樣被提供出來。
例如:
sprintf (usage, "usage: %*s\n", buf_size, argv[0]);
gets()永遠不要使用 gets()。
該函式從標準輸入讀入使用者輸入的一行文字,它在遇到 eof 字元或換行字元之前,不會停止讀入文字。也就是:gets() 根本不執行邊界檢查。因此,使用 gets() 總是有可能使任何緩衝區溢位。
作為乙個替代方法,可以使用方法 fgets()。它可以做與 gets() 所做的同樣的事情,但它接受用來限制讀入字元數目的大小引數,因此,提供了一種防止緩衝區溢位的方法。
getchar()、fgetc()、getc()、read()如果在迴圈中使用這些函式,確保檢查緩衝區邊界
scanf()系列 : sscanf()、fscanf()、vfscanf()、vscanf()、vsscanf()scanf系列的函式也設計得很差。目的地緩衝區也可能會發生溢位。
同樣地,我們用設定寬度也可以解決這個問題。
getenv()使用系統呼叫 getenv() 的最大問題是您從來不能假定特殊環境變數是任何特定長度的。
微軟對於有緩衝溢位危險的api使用其開發的安全版本的庫來替代。 safecrt自visual studio 2005起開始支援。當**中使用了禁用的危險的crt函式,visual studio 2005編譯時會報告相應警告資訊,以提醒開發人員考慮將其替代為safe crt中更為安全。
有關字串拷貝的api
例如:strcpy, wcscpy等
替代的safe crt函式:strcpy_s
有關字串合併的api
例如:strcat, wcscat等
替代的safe crt函式:strcat_s
有關sprintf的api
例如:sprintf, swprintf等
替代的safe crt函式:
_snprintf_s
_snwprintf_s
其它被禁用的api還有scanf, strtok, gets, itoa等等。 」n」系列的字串處理函式,例如strncpy等,也在被禁用之列。
c語言不安全庫 C語言 一些不安全的庫函式
那些不安全的庫函式 c 和 c 不能夠自動地做邊界檢查,邊界檢查的代價是效率。一般來講,c 在大多數情況下注重效率。然而,獲得效率的代價是,c 程式設計師必須十分警覺以避免緩衝區溢位問題。c語言標準庫中的許多字串處理和io流讀取函式是導致緩衝區溢位的罪魁禍首。我們有必要了解這些函式,在程式設計中多加...
c語言不安全庫 C語言 那些不安全的庫函式
c語言 那些不安全的庫函式 c和c 不能夠自動地做邊界檢查,邊界檢查的代價是效率。一般來講,c 在大多數情況下注重效率。然而,獲得效率的代價是,c 程式設計師必須十分警覺以避免緩衝區溢位問題。c語言標準庫中的許多字串處理和io流讀取函式是導致緩衝區溢位的罪魁禍首。我們有必要了解這些函式,在程式設計中...
解決 C 不安全函式告警
錯誤 詳細資訊 c4996 scanf this function or variable may be unsafe.consider using scanf s instead.to disable deprecation,use crt secure no warnings.vs2019使用更...