警告:获取功能是危险的

时间:2010-05-16 08:38:48

标签: c

当我使用获取功能时,gcc会给我一个警告:

warning:the `gets' function is dangerous and should not be used.

为什么获取和放置功能很危险?

6 个答案:

答案 0 :(得分:47)

如果你有这样的代码:

char s[10];
gets( s );

并且在程序运行时输入超过10个字符,您将溢出缓冲区,从而导致未定义的行为。 gets()函数无法阻止您键入字符,因此应该避免。相反,您应该使用fgets(),它允许您限制读取的字符数,以便缓冲区不会溢出。:

char s[10];
fgets( s, 10, stdin );

puts()函数非常安全,提供您输出的字符串以空值终止。

答案 1 :(得分:4)

因为gets不会限制它读取的数据量,因此容易受到缓冲区溢出的影响。 @ Neil的答案有适当的解决方案。

puts函数并不危险,AFAIK,当然,除非您忘记将其终止。

答案 2 :(得分:3)

缓冲区溢出很危险。这是定义:

/* Get a line from the stdin stream. */
char *gets(char *buffer);

缓冲区有多大?如果用户键入了更多可以放入缓冲区的数据,程序可能会崩溃并容易受到黑客利用的影响。

答案 3 :(得分:2)

作为Wikipedia's article saysgets()本质上是不安全的,因为所需要的只是char *作为参数。

这很危险,因为该方法无法知道在任何情况下已为char *分配了多少空间。因此,gets的行为就像它有一个空白检查,以尽可能多地写入数据,这可能导致缓冲区溢出。

替代方法是fgets,它不仅包含字符数组,还包含最大长度和流指针。 gets仅用于向后兼容旧代码。

答案 4 :(得分:1)

获取不会检查缓冲区溢出,从而暴露您的代码以进行攻击

答案 5 :(得分:1)

gets将数据读入给定的内存区域,直到遇到换行符或文件结尾。如果输入(例如,由用户提供)包含的行长于提供给gets的缓冲区的大小,则它将溢出并且将写入缓冲区外的内存。在最坏的情况下,这可能允许恶意用户编写改变程序行为的数据,甚至可能使用该程序的特权执行任意代码(例如,可能在远程服务器上运行或具有其他用户的特权的代码),甚至意外溢出都可能破坏软件。

应该使用

fgets,因为它需要一个额外的参数来约束输入的大小。