【问题标题】:How do I ignore the gets() warning when compiling?编译时如何忽略gets()警告?
【发布时间】:2016-01-24 03:13:10
【问题描述】:

我知道你很快点击了这个期望回答NEVER USE GETS!,但我有一个正当的理由。我正在了解缓冲区溢出,需要有目的地开发易受攻击的软件。

那么,正如标题所述,我如何忽略警告以便编译成功?我试过了:

gcc bo.c -o bo -Wall

...无济于事。

感谢您的帮助。

【问题讨论】:

  • fgets 可能会导致缓冲区溢出。只需提供比真实尺寸更宽的尺寸。所以我想你真的应该避免gets。从最新的C标准中去掉了,所以基本没了
  • 顺便说一句:警告是什么?
  • 从技术上讲,编译确实成功并带有警告。这就是使它们发出警告而不是错误的原因。您能否显示您收到警告的代码行,以及消息是什么? gets 调用不会无条件生成警告。
  • 首先,-Wall 与您想要的相反。其次,警告不会导致编译不成功。即使您收到警告,您的代码也会编译成可执行文件。
  • 假设您有特殊原因开发不良代码,我会关闭警告。如果你只在愿意使用get而不应该使用的行上得到警告,这意味着剩余的代码看起来是正确的。如果您关闭警告,代码可能会因不必要的原因而失败。

标签: c


【解决方案1】:

这段代码:

#include <stdio.h>
int main() {
        char foo[10];
        gets( foo );
        return 0;
}

编译时产生以下输出:

bo.c: In function 'main':
bo.c:4:2: warning: 'gets' is deprecated (declared at /usr/include/stdio.h:638) [-Wdeprecated-declarations]
  gets( foo );
  ^
/tmp/cclk8TkP.o: In function `main':
bo.c:(.text+0x10): warning: the `gets' function is dangerous and should not be used.

第一个警告来自编译器,我们可以看到使用什么标志来抑制它:-Wno-deprecated-declarations

这留下了来自链接器的第二个警告。据我所知,没有办法轻松地抑制该警告(参见herehere)。但是,这应该不是问题,因为它是警告,而不是错误;可执行文件被创建。

【讨论】:

  • 这很奇怪,应该有办法做到这一点。我已经阅读了所有链接并尝试了pragma 方法和所有.. 没有任何效果..
  • 可能有一种使用自定义链接器脚本的方法,但只要您的可执行文件被创建,我认为它比它的价值更麻烦。你总是可以在你的 Makefile 中做一个|&amp; grep -v
  • 这行得通,虽然我的错误没有建议使用-Who-deprecated-declarations
  • @Kenney Ya,就在另一个链接中。
  • @BugHunterUK 你还没有发布你得到的错误,但我想这取决于你的 GCC 版本和平台。上面的输出来自 Linux 3.16 上的 GCC 4.9.2;在 Cygwin 上,我什至没有收到警告......并且暗示了这个建议:提到的警告 [-Wdeprecated-declarations].
【解决方案2】:

使用fgets 代替gets

示例:

fgets (foo, sizeof(foo), stdin);

【讨论】:

    猜你喜欢
    • 2019-04-22
    • 1970-01-01
    • 2018-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    相关资源
    最近更新 更多