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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM