C/C++中容易造成内存溢出的函数
2016-06-30 11:56
295 查看
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 );
}
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 );
}
相关文章推荐
- 关于C++中的类型转换
- c++ 回调类成员函数实现
- 优先队列(堆)
- *leetcode #162 in cpp
- C++中map的一点疑惑...
- c++继承中拷贝构造问题
- C++虚函数与纯虚函数
- Function Table 函数指针表
- debug c++ 经验积累(1)-double free or corruption (!prev)
- leetcode 3sum算法
- 函数指针参数的传递问题
- C++ 在继承中虚函数、纯虚函数、普通函数,三者的区别
- C语言中生产随机数 rand()函数
- C++ 11 Lambda表达式
- leetcode #160 in cpp
- C++中数字与字符串之间的转换
- c++内存对齐原理
- VC++发展与其对应的MFC版本
- C++ 类的继承四(类继承中的重名成员)
- 值得推荐的C/C++框架和库