C中的危險函式 緩衝區溢位

2021-07-16 20:33:11 字數 1075 閱讀 2797

c語言,自創始以來,到現在經久不衰。雖然c你只好自己造輪子,由於c語言允許直接訪問實體地址,可以直接對硬體進行操作,因此它既具有高階語言的功能,又具有低階語言的特性。所以有可移植的彙編之稱。

可是也在這些直接對記憶體的訪問,導致了危險的發生。

有了自由也就多了混亂 ————某斯基

第一位公共敵人就是是 gets(),永遠不要使用 gets()。該函式從標準輸入讀入使用者輸入的一行文字,它在遇到 eof 字元或換行字元之前,不會停止讀入文字。也就是:gets() 根本不執行邊界檢查。因此,使用 gets() 總是有可能使任何緩衝區溢位。

如以下**:

char *p = (char *) malloc(8);

gets(p);

printf("%s",p);

free(p);

return 0;

效果如下

可見,gets()這個函式可以在不經意間溢位任何的緩衝區0.0

所以,還是老話:永遠不要使用 gets()!

那麼怎麼辦呢?可以用fget()來代替啊~

引數如下

fgets(buf, bufsize, stdin);
這個用處和gets()一樣,只是額外加入了限制接收長度的引數;

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

strcat()它可以將乙個字串合併到緩衝區末尾。同樣的其連線的字串的大小一樣如此。

所以推薦使用的是strncpy()和strncat(),雖然帶了其他引數可能顯得麻煩,可是某些情況下可以減少那些意想不到的bug~

緩衝區溢位的問題,廣泛存在,先有個大概認識吧=.=

緩衝區溢位

緩衝區溢位是指當電腦程式向緩衝區內填充的資料位數超過了緩衝區本身的容量。溢位的資料覆蓋在合法資料上。理想情況是,程式檢查資料長度並且不允許輸入超過緩衝區長度的字串。但是絕大多數程式都會假設資料長度總是與所分配的儲存空間相匹配,這就為緩衝區溢位埋下隱患。作業系統所使用的緩衝區又被稱為堆疊,在各個操作程...

緩衝區溢位

緩衝區溢位,簡單的說就是計算機對接收的輸入資料沒有進行有效的檢測 理想的情況是程式檢查資料長度並不允許輸入超過緩衝區長度的字元 向緩衝區內填充資料時超過了緩衝區本身的容量,而導致資料溢位到被分配空間之外的記憶體空間,使得溢位的資料覆蓋了其他記憶體空間的資料。通過往程式的緩衝區寫超出其長度的內容,造成...

緩衝區溢位 棧溢位

1 緩衝區概念 緩衝區 buffer 又稱為快取,它是記憶體空間的一部分。也就是說,在記憶體空間中預留了一定的儲存空間,這些儲存空間用來緩衝輸入或輸出的資料,這部分預留的空間就叫做緩衝區。使用緩衝區有兩個好處 1 減少實際物理讀寫次數 2 緩衝區在建立時就被分配記憶體,這塊記憶體區域一直被重用,可以...