如何在GCC中关闭使用已弃用的gets函数时的警告?

3

我正在运行一个CTF比赛,目前正在编写一道涉及C语言gets函数的题目。我知道这个函数已经被废弃且存在安全隐患,在其他情况下我绝对不会使用它。但是,当我使用gcc编译我的代码并运行二进制文件时,当程序执行到gets函数时,会出现一条友好的错误提示信息:

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

这通常很好,因为它警告您获取不安全,但不幸的是,在我的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

7
看起来你实际上正在使用clang,而不是gcc。 - dbush
5
请原谅我的无知,什么是CTF?(CTF是网络安全竞赛的一种形式,即Capture The Flag的缩写) - Jonathan Leffler
1
@JonathanLeffler - 我认为这是一种有组织的“战争游戏”黑客竞赛:https://ctftime.org/ctf-wtf/ - selbie
2
有什么阻止您不使用gets的东西吗?您可以编写基于fgets(大约3-4行代码)或基于fgetc(约5-6行代码)的不安全的mygets - Jabberwocky
我刚意识到你的警告与 GCC 本身无关 - 因此问题标题似乎被错误地放置了。你得到的警告是来自 macOS,它关于执行使用 gets() 的程序。 - RobertS supports Monica Cellio
显示剩余2条评论
1个回答

8
注意:我刚意识到你的问题标题似乎放错了位置——你收到的警告是来自macOS关于执行使用gets()的程序。这与使用GCC编译无关。
:-/ 无论如何,我保留我的答案供参考。
仅作为评论:我搜索了一下你要找的内容,但似乎没有可靠的方法可以在执行程序时禁用此警告。有人建议重建/usr/lib/libSystem.B.dylib,但我个人认为这有点过于极端,甚至可能会有害。 - 我不建议使用此技术。
如果您真的想创建一个漏洞程序,请尝试通过自定义函数重建gets()并将该函数命名为稍微不同的名称,例如gets_c()。这应该是绕过macOS警告的一种解决方法。
旧答案(关于GCC本身):
首先,您似乎正在使用符合C99或C89/C90标准的编译器,或者使用std=c99std=c89/std=c90选项进行编译,因为只有符合C11之前的标准的编译器才会警告gets()已被废弃。
ISO/IEC在C11中删除了gets()函数。如果您使用符合C11或更高标准的编译器进行编译,当在代码中使用它时,您将收到有关gets()的隐式声明的错误:

"error: implicit declaration of function 'gets'; did you mean 'fgets'? [-Werror=implicit-function-declaration]"


如果您想在编译时抑制警告,请在编译时使用-Wno-deprecated-declarations选项来禁用废弃的声明。
从GCC在线文档中获取:

-Wno-deprecated-declarations

不要警告使用已被标记为过时属性的函数、变量和类型。(请参见函数属性,参见变量属性,参见类型属性。)

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

2
很好的答案,由于我的回答不再有用而进行了编辑。 - David Ranieri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接