這個問題在這里已經有了答案: 為什么gets函式如此危險以至于不應該使用它? (13 個回答) 22 小時前關閉。
我理解為什么 C 開發人員不使用 get,因為存在可以通過緩沖區溢位攻擊利用的漏洞,但是如果使用 fgets() 更安全,為什么還要擁有這個功能。我想我要問的問題是,從安全角度來看,gets() 是否有任何安全的含義?
uj5u.com熱心網友回復:
gets是在大約 50 年前的 C 語言早期發明的,當時人們還沒有想到緩沖區溢位攻擊的概念,也沒有人認為您的程式的用戶會很友好。顯然時代已經改變,回想起來它的設計是一個錯誤。它不能安全使用,因此根本不應該使用,當前版本的 C 語言標準實際上已將其洗掉。請參閱為什么 get 函式如此危險以至于不應該使用它?
至于為什么它首先存在,大多數 stdio 函式都有專門的版本,可以在 stdin/stdout 上運行,而不是在任意流上運行。例如,有fprintf哪些列印到任意流,printf哪些假定stdout. 同樣有fscanf/scanf, getc/getchar, 等等。主要是為了方便,省去stdout到處打字的麻煩。
對于基于行的 I/O,有fputs/fgets任意流和puts/gets標準輸出/標準輸入。請注意,puts/gets它們具有自動附加/去除換行符的特殊功能,因此gets(buf)不完全等同于fgets(stdin, buf, INT_MAX).
目前尚不完全清楚為什么他們決定fgets應該采用尺寸引數但gets不應該采用。可能有一個隱含的假設,即 stdin 更有可能是“不錯的”輸入,例如終端輸入或具有合理行長的文本檔案,而打開的任意檔案fopen可能更可能需要處理極長的行等。當然,原來的 C 語言有很多這樣的方面,事后看來,這些方面并沒有經過深思熟慮。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/485109.html
上一篇:在C中匯入Python模塊
