lzmagic  
博学 审问 慎思 明辨 笃行
日历
<2009年1月>
28293031123
45678910
11121314151617
18192021222324
25262728293031
1234567
统计
  • 随笔 - 16
  • 文章 - 1
  • 评论 - 5
  • 引用 - 0

导航

常用链接

留言簿

随笔分类(18)

随笔档案(16)

文章档案(1)

最新随笔

搜索

  •  

积分与排名

  • 积分 - 4739
  • 排名 - 367

最新评论

阅读排行榜

评论排行榜

 
      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()函数对于读入字符的长度进行了限制。
 
posted on 2008-11-03 15:36 lzmagic 阅读(221) 评论(0)  编辑 收藏 引用 所属分类: C

标题  
姓名  
主页
验证码 *
内容(提交失败后,可以通过“恢复上次提交”恢复刚刚提交的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
[使用Ctrl+Enter键可以直接提交]

相关链接:
网站导航:
 
Copyright © lzmagic Powered by: 博客园 模板提供:沪江博客