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. }   

 

原文链接: https://www.cnblogs.com/klcf0220/p/5629518.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

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

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/236130

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 下午4:55
下一篇 2023年2月13日 下午4:56

相关推荐