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')
- {
- };
- }
建議使用 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);
- }
如果輸入的字大於 buf 的大小,則有溢出的情況.
另還有幾種情況:
a) 使用"%x"或"%d",但最后一個參數是char,也可能導致溢出,因"%x"或"%d"是讀取4個字節,char只有一個字節,因此有可能會覆蓋后面的內容。
b) 使用"d%"讀取64位的數字也可能導致溢出
c) 使用為int定義的bool型時,若賦值為char型時,亦會出現溢出的現象
6. strdup()
strdup()函數是復制輸入字符串,返回新申請內存的字符串。它是調用malloc,因此調用strdup后,需free來釋放申請的內存。
- #include
- #include
- void main( void )
- {
- char buffer[] = "This is the buffer text";
- char *newstring;
- printf( "Original: %s\n", buffer );
- newstring = strdup( buffer );
- free( newstring );
- }
