strcpy用法小结
时间:2010-12-01 来源:bluesky2254
库函数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();
}
代码:
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();
}
相关阅读 更多 +