zoukankan      html  css  js  c++  java
  • 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()) != ' ')   
    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 ", buffer );   
    9.      newstring = strdup( buffer );   
    10.      free( newstring );   
    11. }   
  • 相关阅读:
    学习python第二天
    学习python第一天
    SQL操作
    JAR规范 JAR File Specification
    IDEA快捷键
    Fibonacci数列
    AnyHandler
    测试UDP
    Eclipse卡顿设置
    服务器初始化操作
  • 原文地址:https://www.cnblogs.com/klcf0220/p/5629518.html
Copyright © 2011-2022 走看看