1
该语句在多数情况下都会工作得很好,除非 malloc的调用产生失败。当 malloc失败时,就会给 memcpy返回一个 NULL指针。由于 memcpy处理不了 NULL指针,所以出现了错误。
编译程序查不出这种或其他类似的错误。同样,编译程序也查不出算法的错误,无法验证程序员所作的假定。或者更一般地,编译程序也查不出所传递的参数是否有效。寻找这种错误非常艰苦,只有技术非常高的程序员或者测试者才能将它们根除并且不会引起其他的问题。
2 两个版本的故事
1)
/* memcpy ─── 拷贝不重叠的内存块 */
void memcpy(void* pvTo, void* pvFrom, size_t size)
{
void* pbTo = (byte*)pvTo;
void* pbFrom = (byte*)pvFrom;
if(pvTo == NULL | | pvFrom == NULL)
{
fprintf(stderr, Bad args in memcpy\n );
abort();
}
while(size-->0)
*pbTo++ == *pbFrom++;
return(pvTo);
}
2)
void memcpy(void* pvTo, void* pvFrom, size_t size)
{
void* pbTo = (byte*)pvTo;
void* pbFrom = (byte*)pvFrom;
#ifdef DEBUG
if(pvTo == NULL | | pvFrom == NULL)
{
fprintf(stderr, Bad args in memcpy\n );
abort();
}
#endif
while(size-->0)
*pbTo++ == *pbFrom++;
return(pvTo);
}
这种想法是同时维护调试和非调试即交付两个版本。
这种方法的关键是要保证调试代码不在最终产品中出现。
既要维护程序的交付版本,又要维护程序的调试版本。
转载请注明原创连接:http://blog.csdn.net/wujunokay/article/details/17723205