void *memcpy(void * dst, static void *src, size_t n)
{
Char*ret;
if (dst == NULL || src == NULL)
return NULL;
ret = dst;
While(n--)
{
*(char*) dst++ = *(char*) src++;
}
return ret;
}
我有一些测试方法:
if(dst==NULL || src==NULL)
n=0; n=1; n=65535;
(int,char ,float,double,class);
会有更多方法吗?
答案 0 :(得分:1)
似乎如果你正在测试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()
应该考虑到这一点,而不是seg。故障。所以我也测试了一些未对齐的指针。
存在具有各种填充的恕我直言,深奥的平台。只是注意到这里。
如果NULL != 0
,memcpy(dst, 0, 1)
应该工作而不是错误。
最后一个古怪的测试:(不确定如何实施。)确保src
和dst
未在其分配之外访问范围。 memcpy(dst, src, 1)
没有做uint32_t t = *((uint32_t*) src)
之类的事情。因为即使t
只有dst
的LSByte可能写入src
,但size_t
的访问在其范围之外是禁止的。
你可以进行一些性能测试(速度),但我认为这是一个简单的功能测试套件。
注意:某些非常规操作系统已签名static
。 (我认为他们不合规)
BTW:memcpy(void * dst, static void *src ...
在memcpy(void * dst, const void *src ...
中非常好奇,导致编译错误。假设你想要{{1}}
答案 1 :(得分:0)
测试中缺少的一个重要方法是部分重叠dst 和src。
传统上*,如果dst和src重叠,则memcpy中的行为是未定义的。这也意味着测试这种情况毫无意义。将memmove用于可能重叠的缓冲区。
*含义:用户期望它,标准指定它,历史也是如此。