Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1844319
  • 博文数量: 274
  • 博客积分: 2366
  • 博客等级: 大尉
  • 技术积分: 1880
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-22 09:37
文章分类

全部博文(274)

文章存档

2022年(1)

2020年(10)

2019年(7)

2018年(18)

2017年(26)

2016年(32)

2015年(43)

2014年(30)

2013年(44)

2012年(36)

2011年(17)

2010年(10)

分类: C/C++

2013-01-22 16:23:53

C/C++中容易造成内存溢出的函数

1.strcpy()

strcpy()函数将源字符串复制到缓冲区。没有指定要复制字符的具体数目。复制字符的数目直接取决于源字符串中的数目。如果源字符串碰巧来自用户输入,且没有专门限制其大小,则有可能会陷入大的麻烦中!

建议使用strncpy.

2.strcat()

strcat()函数非常类似于 strcpy(),除了它可以将一个字符串合并到缓冲区末尾。它也有一个类似的、更安全的替代方法 strncat()。如果可能,使用 strncat() 而不要使用 strcat()。

3. gets

  1. void main()   
  2. {   
  3.     char buffer[5];   
  4.   
  5.     /* DON'T DO THIS */  
  6.     while ((buffer[i++] = getchar()) != '\n')   
  7.      {   
  8.            
  9.      };   
  10. }   
void main() { char buffer[5]; /* DON'T DO THIS */ while ((buffer[i++] = getchar()) != '\n') { };}

建议使用 fgets

4.sprintf()   vsprintf()

函数 sprintf()和 vsprintf()是用来格式化文本和将其存入缓冲区的通用函数。它们可以用直接的方式模仿 strcpy() 行为。换句话说,使用 sprintf() 和 vsprintf() 与使用 strcpy() 一样,都很容易对程序造成缓冲区溢出。

5.scanf() 系列

scanf()    sscanf()    fscanf()    vfscanf()    vscanf()    vsscanf()

scanf系列的函数也设计得很差。在这种情况下,目的地缓冲区会发生溢出。考虑以下代码:

  1. void main(int argc, char **argv)   
  2. {        
  3.     char buf[256];   
  4.      sscanf(argv[0], "%s", &buf);   
  5. }   
void main(int argc, char **argv) { char buf[256]; sscanf(argv[0], "%s", &buf);}

如果输入的字大于 buf 的大小,则有溢出的情况.

另还有几种情况:

a) 使用"%x"或"%d",但最后一个参数是char,也可能导致溢出,因"%x"或"%d"是读取4个字节,char只有一个字节,因此有可能会覆盖后面的内容。

b) 使用"d%"读取64位的数字也可能导致溢出

c) 使用为int定义的bool型时,若赋值为char型时,亦会出现溢出的现象

6. strdup()

strdup()函数是复制输入字符串,返回新申请内存的字符串。它是调用malloc,因此调用strdup后,需free来释放申请的内存。

  1. #include   
  2. #include   
  3.   
  4. void main( void )   
  5. {   
  6.     char buffer[] = "This is the buffer text";   
  7.     char *newstring;   
  8.      printf( "Original: %s\n", buffer );   
  9.      newstring = strdup( buffer );   
  10.      free( newstring );   
  11. }   
阅读(5770) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~