簡體   English   中英

GCC中關於using deprecated gets的警告如何關閉?

[英]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=c99std=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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM