日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

發布時間:2024/4/11 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C/C++中容易造成内存溢出的函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.strcpy()

strcpy()函數將源字符串復制到緩沖區。沒有指定要復制字符的具體數目。復制字符的數目直接取決于源字符串中的數目。如果源字符串碰巧來自用戶輸入,且沒有專門限制其大小,則有可能會陷入大的麻煩中!

建議使用strncpy.

2.strcat()

strcat()函數非常類似于 strcpy(),除了它可以將一個字符串合并到緩沖區末尾。它也有一個類似的、更安全的替代方法 strncat()。如果可能,使用 strncat() 而不要使用 strcat()。

3. gets

  • void main() ??
  • { ??
  • ????char?buffer[5]; ??
  • ??
  • ????/* DON'T DO THIS */??
  • ????while ((buffer[i++] = getchar()) != '\n') ??
  • ???? { ??
  • ???????? ??
  • ???? }; ??
  • } ??
  • 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系列的函數也設計得很差。在這種情況下,目的地緩沖區會發生溢出??紤]以下代碼:

  • void main(int?argc,?char?**argv) ??
  • {????? ??
  • ????char?buf[256]; ??
  • ???? sscanf(argv[0], "%s", &buf); ??
  • } ??
  • 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來釋放申請的內存。

  • #include <string.h> ??
  • #include <stdio.h> ??
  • ??
  • void main( void ) ??
  • { ??
  • ????char?buffer[] = "This is the buffer text"; ??
  • ????char?*newstring; ??
  • ???? printf( "Original: %s\n", buffer ); ??
  • ???? newstring = strdup( buffer ); ??
  • ???? free( newstring ); ??
  • } ??
  • 總結

    以上是生活随笔為你收集整理的C/C++中容易造成内存溢出的函数的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。