c语言早期的时候当从标准输入读入一个字符串的时候使用的是gets()函数,但是后来发现gets()函数存在bug才出现了fgets()函数的定义。现在为了和老的程序兼容,c的编译程序当中仍旧保持对于gets()函数的支持。本篇就是说明gets()函数的bug所在。举个例子来具体说明:
有一段代码:
char line[124];
gets(line);
这里line是一个能容纳124个字符的数组,它是堆栈上自动分配的,如果gets()读入的字符串长于124个字符, 那gets()函数会继续把读入多出的内容压倒堆栈当中。这样就出现了溢出的问题,其实早期的蠕虫病毒就有的是利用这个bug而实现的。在c的官方网站上强烈建议使用fgets()函数。应该把上面的代码替换成:
char line[124];
if(fgets(line,sizeof(line),stdin)==NULL)
exit(1);
这样就不会出现溢出的问题了,因为fgets()函数对于读入字符的长度进行了限制。