我看到了另一个关于代码使用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。可能带来 如果在我下一次升级之后仍然如此,那就好了。
谢谢大家,感谢您的回复!
答案 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库。