测试memcpy函数

时间:2013-09-28 05:54:53

标签: c testing memcpy

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 个答案:

答案 0 :(得分: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()应该考虑到这一点,而不是seg。故障。所以我也测试了一些未对齐的指针。

存在具有各种填充的恕我直言,深奥的平台。只是注意到这里。


如果NULL != 0memcpy(dst, 0, 1) 应该工作而不是错误。


最后一个古怪的测试:(不确定如何实施。)确保srcdst未在其分配之外访问范围。 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用于可能重叠的缓冲区。

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