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 );
- }