如何让gcc 4.7警告使用臭名昭着的gets()函数?

时间:2016-01-09 16:36:32

标签: c compiler-warnings gcc-warning gets gcc4.7

我看到了另一个关于代码使用gets()的C的问题, 而且我评论了关于从不使用gets()的常见警告 当你想要证明如何打破安全时。

这一次,我决定检查一下我的编译器是否发出了警告 使用gets()。当然我希望它会。对,对吧?即使 你没有指定任何警告?

想象一下,当我发现编译器不是时,我感到惊讶 警告默认情况下,但我甚至无法弄明白如何使警告它!

有问题的编译器是关于Debian的gcc 4.7.2,这里是代码I. 使用:

#include <stdio.h>

int main(void)
{
    char s[10];

    gets(s);
    puts(s);

    return 0;
}

尝试gcc g.c。编译时没有警告。运行。获取段错误 你输入太多的文字。

尝试使用我通常放在makefile中的所有标准警告:

gcc -W -Wall -Wno-long-long -Wshadow -Wlarger-than-1000 \
-Wpointer-arith -Wbad-function-cast -Wcast-qual -Wcast-align \
-Wconversion -Waggregate-return -Wmissing-prototypes \
-Wmissing-declarations -Wpadded -Wredundant-decls -Wnested-externs g.c

同样的结果。

尝试-std=c11。即便如此,也没有产生警告 非常奇怪,考虑到gets()在C11中根本不存在。试着 c99也是。没有警告。

那么这里发生了什么?为什么这个使用非常广泛的编译器不会发出警告 当我在整个C语言中使用最弃用的函数时,我?

编辑:根据Keith Thompson的建议,我查了一下 stdio.h中的弃用属性。它不存在。然后我复制了 头文件和实验。添加这些字符串中的任何一个(我 在其他标题中找到)到声明的末尾确实生成了一个 警告:

__attribute_deprecated__
__attribute__ ((__deprecated__))

警告:

‘gets’ is deprecated (declared at /usr/include/stdiotz.h:632) [-Wdeprecated-declarations]

总结我到目前为止看到的回复,似乎是版本 在我的系统上的libc不包括警告,它确实存在于 以后的版本。这很奇怪,因为警告已经存在 从1996年开始形成。我模糊地回忆起libc已经分道扬.. 至少一次,所以也许警告被排除在一个分支之外 显着晚于其他分支。

我想我会在Debian邮件列表上询问这个问题,或许也许 根据我的学习情况将其报告为错误。

编辑2 :我看过一些源代码。格里布已发出警告 自2007年至少,libio/iogets.c。 eglibc 2.13,我拥有的那个, 具有完全相同的警告代码:

#ifdef _LIBC
link_warning (gets, "the `gets' function is dangerous and should not be used.")
#endif

我认为编译库时没有定义_LIBC。为什么我 不知道。我不确定_LIBC的目的是什么。

所以,答案似乎归结为“它是图书馆,无论如何 在他们的智慧中,Debian开发人员对此负责 以这种方式编译。“我们可能永远不知道为什么。

不会将其报告为bug,因为我正在使用oldstable。可能带来 如果在我下一次升级之后仍然如此,那就好了。

谢谢大家,感谢您的回复!

1 个答案:

答案 0 :(得分:5)

包含此警告消息的不是GCC,而是GLIBC。

你不太可能使用太旧版本的GLIBC:自1996年以来警告至少是 。请参阅GitHub上this GLIBC code的第67行作为示例(注意)日期: 1996年12月15日):

link_warning (gets, "the `gets' function is dangerous and should not be used.")

很可能你正在使用不同的C库。