this program uses gets(), which is unsafe.

好久沒有來了,這次練習,遇到了一個有意思的提醒:this program uses gets(), which is unsafe.

得到()函數。

說道gets()函數,就要說道fgets()函數。

與fgets()函數是從流stream中讀入最多num個字符到字符數組str中,當遇到換行符時、或讀到num-1個字符時停止。並且在結尾自動加上’’空字符。

得到()函數則是從標準輸入stdin讀取一個字符串,遇到換行或結束時候終止。不同於fgets,他沒有指定num,所以需要注意字符數組str的大小。
fgets和gets之間沒有宏定義的關係,彼此各自有自己的實現。那麼為什麼說gets函數不安全呢?因為蠕蟲病毒的實現就是函數gets的“功勞”。gets函數的任務是從流中讀入一個字符串。它的調用者會告訴它把讀入的字符串放在什麼地方。但是,得到()函數並不檢查緩衝區大小,如果調用者提供了一個指向堆棧的指針,並且get()函數讀入的字符數量超過了超過了緩衝區的空間大小,得到()會愉快地將多出來的字符繼續寫入到堆棧中,這就覆蓋了堆棧中原來的內容。

  1. int main(空虛)
  2. {
  3. 字符的字符串[81];
  4. ......
  5. 得到(串);

這樣任何多出來的數據都會被寫入堆棧。
總之,普遍的建議就是用fgets()函數完全替代gets()函數。
另外:各種編譯器對於gets()的態度不一樣,有的會直接封殺編譯不通過,有的則是提示,我用的gcc是直接通過不提示。但是在運行的時候終端卻提示這個程序使用了gets函數,或許,是gcc給加上的一句話吧!
最後,文章的部分內容借鑒自這裡:)

由...出版 R0uter

如非聲明,本人所著文章均為原創手打,轉載請註明本頁面鏈接和我的名字。

發表評論

您的電子郵件地址不會被公開. 必填字段標 *