C语言 如何禁用有关在 GCC 中使用已弃用的 get 的警告?



我正在运行一个CTF,我目前正在编写一个利用C的gets函数的问题。我知道该功能已弃用且危险,我永远不会在任何其他情况下使用它。不幸的是,gcc编译我的代码,当我在命中gets函数时运行二进制文件时,我收到一条友好的错误消息:

warning: this program uses gets(), which is unsafe.

这通常很棒,因为它警告您 get 是不安全的,但不幸的是,在我的 CTF 中,我认为此错误消息使问题变得有点太容易了。你知道我将如何禁用此警告吗?谢谢!

$ 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,如果它确实有效,没有任何结果或经验,但我个人认为这有点太极端了,甚至可能是有害的。- 我不推荐这种技术。

如果你真的想创建一个漏洞利用程序,试着用一个 costum 制作的函数重建gets(),并将函数命名得有点不同,比如 f.e.gets_c().这应该是从 macOS 禁用此警告的解决方法。


旧答案(关于海湾合作委员会本身(:

首先,您似乎正在使用符合 C99 或 C89/C90 的编译器,或者使用std=c99std=c89/std=c90选项进行编译,因为只有编译器符合 C11 之前的标准警告gets()被弃用。

ISO/IEC 删除了 C11 中的gets()功能。如果使用 C11 或更新的符合标准的编译器进行编译,则在代码中使用隐式声明时会收到有关隐式声明gets()的错误:

">错误:函数'gets'的隐式声明;你是说'fgets'吗?[-Werror=implicit-function-declaration]">


如果要在编译时禁止显示警告,请使用编译时的-Wno-deprecated-declarations选项禁用对已弃用声明的诊断。

来自海湾合作委员会在线文档:

-Wno 已弃用声明

不要警告使用已弃用属性标记为已弃用的函数、变量和类型的使用。(请参阅函数属性,请参阅变量属性,请参阅类型属性。

资料来源: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

相关内容

  • 没有找到相关文章

最新更新