![](/img/trans.png)
[英]Disable warning: the `gets' function is dangerous in GCC through header files?
[英]How to disable the warning about using deprecated gets in GCC?
我正在運行一個 CTF,我目前正在編寫一個利用 C 的gets
function 的問題。我知道 function 已被棄用並且很危險,我絕不會在任何其他情況下使用它。 不幸的是, gcc
編譯了我的代碼,當我gets
被命中時運行二進制文件時,我收到一條友好的錯誤消息:
warning: this program uses gets(), which is unsafe.
這通常很好,因為它會警告您 gets 是不安全的,但不幸的是,在我的 CTF 中,我認為此錯誤消息使問題變得有點太簡單了。 你知道我將如何禁用此警告 go 嗎? 謝謝!
$ gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 11.0.3 (clang-1103.0.32.62)
Target: x86_64-apple-darwin19.4.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
注意:我剛剛意識到你的問題標題似乎放錯了地方 - 你收到的警告來自 macOS 關於執行使用gets()
的程序。 與使用GCC編譯無關。
:-/ 無論如何,我讓我的答案活着以供參考。
就像評論一樣:我用谷歌搜索了一下你在找什么,但似乎沒有可靠的方法可以在執行程序時禁用此警告。 有人建議重建/usr/lib/libSystem.B.dylib
如果它確實有效,則沒有任何結果或經驗,但我個人認為這有點過於極端,甚至可能有害。 - 我不推薦這種技術。
如果您真的想創建一個漏洞利用程序,請嘗試通過定制的 function 重建gets()
並將 function 命名為有點不同,例如 fe gets_c()
。 這應該是從 macOS 禁用此警告的解決方法。
舊答案(關於 GCC 本身):
首先,您似乎正在使用 C99 或 C89/C90 兼容的編譯器,或者使用std=c99
或std=c89
/ std=c90
選項進行編譯,因為只有符合 C11 之前標准的編譯器才會警告gets()
被棄用.
ISO/IEC 刪除了 C11 中的gets()
function。 如果您使用 C11 或更高版本的符合標准的編譯器進行編譯,則在代碼中使用gets()
時會出現有關隱式聲明的錯誤:
“錯誤:function
'gets'
隱式聲明;您是說'fgets'
嗎?[-Werror=implicit-function-declaration
] ”
如果要在編譯時抑制警告,請在編譯時使用-Wno-deprecated-declarations
選項以禁用對已棄用聲明的診斷。
來自 GCC 在線文檔:
-Wno-deprecated-declarations
不要警告使用 deprecated 屬性標記為已棄用的函數、變量和類型。 (參見 Function 屬性,參見變量屬性,參見類型屬性。)
資料來源: https://gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Warning-Options.html
如果您想在代碼中嵌入對警告的抑制,請使用 David 已刪除的答案中使用的方法,通過使用#pragma
實現對-Wno-deprecated-declarations
的抑制:
char str[256];
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
gets(str);
#pragma GCC diagnostic pop
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.