警告:获取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的答案有适当的解决方案。
puts
function并不危险,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