自己写一个strcpy(char*dest,char*src),如何在函数内部实现防御性溢出?
void strcpy(char*dest, char*src)
{
while (*dest != '/0' && *src != '/0')
{
*(dest++) = *(src++);
}
}
char *strcpy(char *strDestination, const char *strSource);
{
assert((strDestination!=NULL) && (strSource !=NULL));
char *address = strDestination;
while( (*strDestination++ = * strSource++) != '/0') NULL ;
return address ;
}
//以下是高质量C++编程指南上面的解答,楼主参考一下:
char* strcpy(char*strDest,const char*strSrc)
{
assert(strDest!=NULL&&strSrc!=NULL); //2分
char* address=strDest; //2分
while(*(strDest++)=*(strSrc++)!='/0') //2分
NULL;
return address; //2分
}
IsBardReadPtr判断源可读否?
IsBadWritePtr 判断目标地址是否可写,
但这样并不很保险
strcpy() 函数将源字符串复制到缓冲区。没有指定要复制字符的具体数目。复制字符的数目直接取决于源字符串中的数目。如果源字符串碰巧来自用户输入,且没有专门限制其大小,则有可能会陷入大的麻烦中!
如果知道目的地缓冲区的大小,则可以添加明确的检查:
if(strlen(src) >= dst_size) {
/* Do something appropriate, such as throw an error. */
}
else {
strcpy(dst, src);
}
也可以用
strncpy()
代替strcpy()
strncpy(dst, src, dst_size-1);
dst[dst_size-1] = '/0';
确保 strcpy() 不会溢出的另一种方式是,在需要它时就分配空间,确保通过在源字符串上调用 strlen() 来分配足够的空间。例如:
dst = (char *)malloc(strlen(src));
strcpy(dst, src)