1
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;
}

我有一些方法可以测试:

  1. if(dst==NULL || src==NULL)
  2. n=0; n=1; n=65535;
  3. 输入(int,char ,float,double,class);

会不会有更多的方法?

4

2 回答 2

1

看来,如果您正在测试memcpy(),您应该知道它的代码——或者至少,不要假设它memcpy()总是如图所示实现。你的测试需要挑战memcpy()假设它可能已经开始,但可能会随着时间的推移而变化。


测试中缺少的一个重要方法是部分重叠dstsrc.

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 != 0memcpy(dst, 0, 1) 应该工作而不是段错误。


最后一个古怪的测试:(不确定如何实现。)确保srcdst没有在分配的范围之外 被访问。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 ...

于 2013-09-28T23:30:57.390 回答
0

测试中缺少的一个重要方法是部分重叠 dst 和 src。

传统上*,如果 dst 和 src 重叠,memcpy 中的行为是未定义的。这也意味着测试这个案例是没有意义的。对可能重叠的缓冲区使用 memmove。

*含义:用户期望它,标准指定它,历史上也是如此。

于 2017-12-15T23:40:00.753 回答