c 语言的常见内存溢出函数

内存溢出函数

1.strcpy()  

strcpy()函数将源字符串复制到缓冲区。没有指定要复制字符的具体数目。复制字符的数目直接取决于源字符串中的数目。如果源字符串碰巧来自用户输入,且没有专门限制其大小,则有可能会陷入大的麻烦中!  

建议使用strncpy.

 

2.strcat()  

strcat()函数非常类似于 strcpy(),除了它可以将一个字符串合并到缓冲区末尾。它也有一个类似的、更安全的替代方法 strncat()。如果可能,使用 strncat() 而不要使用 strcat()  

3. gets

void main() {

   char buffer[5];

   while ((buffer[i++] = getchar()) != '/n') {}; /* DON'T DO THIS */

}

 

4.sprintf()   vsprintf()  

函数 sprintf() vsprintf()是用来格式化文本和将其存入缓冲区的通用函数。它们可以用直接的方式模仿 strcpy() 行为。换句话说,使用 sprintf() vsprintf() 与使用 strcpy() 一样,都很容易对程序造成缓冲区溢出。 

 

5.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 <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 );
    
    
}
    
    
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值