看来,如果您正在测试memcpy()
,您不应该知道它的代码——或者至少,不要假设它memcpy()
总是如图所示实现。你的测试需要挑战memcpy()
假设它可能已经开始,但可能会随着时间的推移而变化。
测试中缺少的一个重要方法是部分重叠dst
和src
.
extern void *memcpy(void * dst, const void *src, size_t n);
char buf[50] = {0} ;
strcpy(&buf[5], "1234567890";
memcpy(buf, &buf[5]);
// what is the result?
char buf2[50] = {0} ;
strcpy(&buf2[0], "1234567890";
memcpy(&buf2[5], buf2);
// what is the result?
奇数指针值的测试用例。一些平台对指针对齐有限制。一个好的memcpy()
应该考虑到这一点,而不是分段。过错。所以我也会测试一些未对齐的指针。
恕我直言,存在具有各种填充的深奥平台。只是注意到这里。
如果NULL != 0
,memcpy(dst, 0, 1)
应该工作而不是段错误。
最后一个古怪的测试:(不确定如何实现。)确保src
和dst
没有在分配的范围之外 被访问。memcpy(dst, src, 1)
没有做类似的事情uint32_t t = *((uint32_t*) src)
。因为即使只有 LSByte oft
可能被写入dst
,在其范围之外的访问也是src
禁止的。
您可以进行一些性能测试(速度),但我假设这是一个简单的功能测试套件。
注意:一些非常规操作系统已size_t
签名。(我认为他们不合规)
顺便说一句:static
很好奇memcpy(void * dst, static void *src ...
,它会导致编译器错误。假设你想要memcpy(void * dst, const void *src ...