gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:29:26 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com