關於c標準庫函數gets的危害


gets從標準輸入設備讀字符串函數。
原 型 char * gets ( char * str );

gets可以無限讀取,不會判斷上限,所以程序員應該確保buffer的空間足夠大,以便在執行讀操作時不發生溢出。如果溢出,多出來的字符將被寫入到堆棧中,這就覆蓋了堆棧原先的內容,破壞一個或多個不相關變量的值。這個事實導致gets函數只適用於玩具程序,爲了避免這種情況,我們可以用fgets(stdin) (fgets實際上可以讀取標準輸入(即大多數情況下的鍵盤輸入),具體參閱fgets詞條)來替換gets()。在V7的手冊(1979年)中說明:爲了向後兼容,gets刪除換行符,gets並不將換行符存入緩衝區。
由於可以無限讀取,所以在2011年12月,ANSI 採納了 ISO/IEC 9899:2011 標準,標準中刪除了 gets()函數,使用一個新的更安全的函數gets_s()替代。



#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
char c0;
char c1;
char c2;
char c3;
gets(&c0);
printf("%c%c%c%c\n", c0,c1,c2,c3);
return 0;
}

/**
測試下

$./a.out 
abc
abc


*/





發佈了22 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章