【发布时间】:2011-02-27 23:38:48
【问题描述】:
来自man gets:
永远不要使用gets()。因为它是 不知道是不可能的 数据提前多少 字符 gets() 将读取,并且 因为gets() 会继续存储 超出缓冲区末尾的字符, 使用起来非常危险。 它已被用来破坏计算机 安全。请改用 fgets()。
我几乎在所有地方都看到scanf 以应该有同样问题的方式使用 (buffer overflow/buffer overrun):scanf("%s",string)。这种情况下存在这个问题吗?为什么scanf 手册页中没有关于它的引用?为什么使用-Wall 编译时 gcc 没有警告?
ps:我知道有一种方法可以在格式字符串中用scanf指定字符串的最大长度:
char str[10];
scanf("%9s",str);
编辑:我不是要确定前面的代码是否正确。我的问题是:如果scanf("%s",string) 总是错误的,为什么没有警告并且手册页中没有任何相关内容?
【问题讨论】:
-
您的维基百科链接显示
scanf不安全。 -
@aviraldg 你说得对,我以前读过它,但我没有找到写标题的好方法。我编辑了它。
-
大家都回答:
scanf("%s",...)不安全。关于此的另一个参考:c-faq.com/stdio/scanfprobs.html。我仍然不明白手册页中没有关于此的内容。
标签: c scanf buffer-overflow gets buffer-overrun