c - 如何使gcc 4.7警告使用臭名昭著的gets()函数?

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

我看到了另一个有关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/

相关文章:

float和int之间的转换,字节表示?

c - 如何在 C 中哈希 CPU ID

iphone - 在 Objective-C 类之间共享 C 函数

c - Xlib 隐藏然后显示原始状态的窗口

编译器不会提示错误的语法

gcc - 如何查询C++的GCC警告?

c - 函数 ‘fgetc_unlocked’ 的隐式声明,使用 gcc 5.2

c - 为什么 gcc -Wall 会发出有关零长度格式字符串的警告?

report - 带有编译器警告的 clang 扫描构建报告?

scala - 如何禁用 Scala 警告 "The outer reference in this type test cannot be checked at run time"