我看到了另一个有关C的问题,代码在哪里使用gets()
,
我评论了关于永远不要使用gets()
的常规警告
当您想演示如何破坏安全性时。
这次,我决定检查编译器是否发出有关
使用gets()
。我当然希望如此。一定要吧?即使
您没有指定任何警告?
当我发现,不仅编译器没有
默认情况下发出警告,但我什至不知道如何发出警告!
有问题的编译器是Debian上的gcc 4.7.2,这是我的代码
用过的:
#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
中的deprecation属性。它不在那里。然后,我复制了头文件并进行了实验。添加这些字符串之一(我
在其他 header 中找到),直到声明的末尾确实生成了一个
警告:
__attribute_deprecated__
__attribute__ ((__deprecated__))
警告:
‘gets’ is deprecated (declared at /usr/include/stdiotz.h:632) [-Wdeprecated-declarations]
总结到目前为止我所看到的答复,看来该版本
我系统上的libc版本不包含警告,该警告确实存在于
更高版本。这很奇怪,因为警告已经存在
至少从1996年开始就成立了。我隐约记得libc是在
至少一次,所以警告可能被排除在一个分支之外
比其他分支机构晚很多。
我想我会在Debian邮件列表上问这个问题,也许
根据我的经验将其报告为错误。
编辑2 :我看过一些源代码。 glibc发出了警告
从2007年开始,至少在
libio/iogets.c
中。 eglibc 2.13,我有一个具有完全相同的警告代码:
#ifdef _LIBC
link_warning (gets, "the `gets' function is dangerous and should not be used.")
#endif
我想在编译库时 undefined
_LIBC
。为什么我不知道我不确定
_LIBC
的用途是什么。因此,答案似乎归结为“这是图书馆,无论
用他们的智慧,原因是Debian开发人员对此负责
那样编译。”我们可能永远都不知道为什么。
由于我使用的是oldstable,因此不会将其报告为错误。可能带来
如果在我的下一次升级后仍以这种方式进行升级。
谢谢大家,您的信息丰富!
最佳答案
包含此警告消息的不是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库。
关于c - 如何使gcc 4.7警告使用臭名昭著的gets()函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34696046/