strcpy用法小结

库函数strcpy其实有几个漏洞
1.传入的指针没有非空判断
代码:
char a[]="hello";
strcpy(a,NULL);
编译和运行:编译通过,运行段错误
[root@fedora7 code]# gcc test.c -o test
[root@fedora7 code]# ./test
Segmentation fault
2.没有检查两个字符串是否以NULL(即'\0')结尾
代码1:
char b[10]="1234567890";  //注意这里的字符串已经越界了
strcpy(b,'a');  //这里的2个字符串都没有结尾标志
编译和运行:运行段错误
[root@fedora7 code]# gcc test.c -o test
test.c: In function ‘test’:
test.c:61: warning: passing argument 2 of ‘strcpy’ makes pointer from integer without a cast
[root@fedora7 code]# ./test
Segmentation fault
代码2:
将代码1中的
strcpy(b,'a');
换成
strcpy(b,"a");
编译和运行:都没有问题
[root@fedora7 code]# gcc test.c -o test
[root@fedora7 code]# ./test
a
3.目标字符串长度<源字符串长度 没有判断
代码:
char a[5]="haha";
char b[10]="123456789";
strcpy(a,b);
puts(a);
puts(b);
编译和运行:运行段错误
[root@fedora7 code]# gcc test.c -o test
[root@fedora7 code]# ./test
123456789
123456789
Segmentation fault
(这个段错误不太好解释,没想明白)
 
4.代码实例:
//date:20100820
//function:my_strcpy
//note:模仿strcpy
/*
strcpy原型:char *strcpy(char *dstr,const char *sstr);
库函数解析:将字符串sstr的字符拷贝到dstr,返回dstr的地址。(注意返回值)
*/
char * my_strcpy(char *dstr,const char *sstr);  //const说明源字符串为只读变量
test()
{
 char a[]="hello";
 char b[32];
 my_strcpy(b,a);
 puts(b);
}
char * my_strcpy(char *dstr,const char *sstr)
{
 if(!sstr || !dstr)   //防止空指针操作
  return NULL;
#if 0    //方法一    
 printf("Method A\n");
 while(*sstr!='\0')
  *dstr++=*sstr++;
 *dstr='\0';  //注意复制时需要加上字符结束标志
#else    //方法二
 printf("Method B\n");
 while((*dstr++=*sstr++)!='\0');  //这里不需要加上字符结束标志,想想为什么呢? 
#endif
}
main()
{
 test();
}

作者: bluesky2254   发布时间: 2010-12-01