4“无定义”意味着“要避开”
通过增加一个可以验证两个内存块绝不重叠的断言,可以把 memcpy加强如下:
/* memcpy ─── 拷贝不重叠的内存块 */
void memcpy(void* pvTo, void* pvFrom, size_t size)
{
void* pbTo = (byte*)pvTo;
void* pbFrom = (byte*)pvFrom;
ASSERT(pvTo != NULL && pvFrom != NULL);
ASSERT(pbTo>=pbFrom+size || pbFrom>=pbTo+size);
while(size-->0)
*pbTo++ == *pbFrom++;
return(pvTo);
}
其实只要把两个内存块比作两辆在停车处排成一行等候的轿车,就可以很容易明白其中的道理。我们知道,如果一辆车的后保险杠在另一辆车的前,保险杠之前两辆车就不会重叠。上面的检查实现的就是这个思想,那里 pbTo和 pbFrom 是两个内存块的“后保险杠”。 PbTo+size和 pbFrom+size分别是位于其相应“前保险杠”之前的某个点。就是这么简单。
要从程序中删去无定义的特性或者在程序中使用断言来检查出无定义特性的非法使用
5 不要让这种事情发生在你的身上
在 1988 年晚些时候,Microsoft 公司的摇钱树 DOS版 Word 被推迟了三个月,明显地影响了公司的销售。这件事情的重要原因,是整整六个月来开发小组成员一直认为他们随时都可以交出 Word。
这个小组的代码与 Word代码之间一个明显的区别是 Word 代码从过去到现在一直都使用断言和调试代码而他们的代码却几乎没有使用断言。
转载请注明原创连接:http://blog.csdn.net/wujunokay/article/details/17723407