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

Posted spron

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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. }

建议使用 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. }

如果输入的字大于 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. }   

 

以上是关于C/C++中容易造成内存溢出的函数的主要内容,如果未能解决你的问题,请参考以下文章

Tomcat内存溢出的原因

Tomcat 内存溢出对应解决方式

内存溢出和内存泄露的区别,分别什么情况下出现?

堆栈溢出 - 静态内存与动态内存

java jdbc 批处理会造成内存溢出吗

JAVA-分页查询