警告:获取function是危险的

当我使用gets函数时,gcc给了我一个警告:

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

为什么获取和放置function危险?

如果您有这样的代码:

 char s[10]; gets( s ); 

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

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

puts()函数是完全安全的, 前提是您输出的字符串以空值终止。

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

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

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

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

缓冲区有多大? 如果用户键入的更多数据可以容纳在缓冲区中,则程序可能会崩溃并容易受到黑客攻击。

正如维基百科的文章所说 , gets()本质上是不安全的,因为它只需要一个char *作为参数。

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

另一种方法是fgets ,它不仅包含字符数组,还包含最大长度和流指针。 gets只是为了向后兼容旧代码而保留。

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

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

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

见http://www.c-faq.com/stdio/getsvsfgets.html