为什么在写入不足够大的malloc内存时strcpy“工作”?

时间:2012-03-29 04:48:24

标签: c++ c

  

可能重复:
  Why does this intentionally incorrect use of strcpy not fail horribly?

下面是代码:

char* stuff = (char*)malloc(2);
 strcpy(stuff,"abc");
 cout<<"The size of stuff is : "<<strlen(stuff);

即使我为了东西分配了2个字节,为什么strcpy仍然可以工作,而strlen的输出是3.不应该抛出像索引一样的东西吗?

5 个答案:

答案 0 :(得分:3)

C和C ++不像Java和C#那样进行自动边界检查。这段代码会覆盖字符串末尾的内存中的东西,破坏那里的东西。这可能导致奇怪的行为或以后崩溃,所以对这些事情保持谨慎是好的。

通过C和C ++标准,访问数组末尾被视为“未定义的行为”。这意味着标准没有规定程序执行时必须发生的事情,因此触发UB的程序永远不会发生任何可能发生的事情。它可能会继续工作,没有明显的问题。它可能会立即崩溃。在做其他不应该出问题的事情时可能会崩溃。它可能行为不端而不是崩溃。或者快速龙可能来吃你。任何事情都可能发生。

顺便说一下,写一个数组的末尾称为buffer overflow,这是安全漏洞的常见原因。如果那个“abc”字符串实际上是用户输入,那么熟练的攻击者可以将字节放入其中,最终覆盖类似函数的返回指针,这可以用来使程序运行不同的代码,并且执行不同的操作。应该。

答案 1 :(得分:0)

你只是写堆内存,通常不会崩溃,但以后会发生坏事。 C不会阻止你射击自己的脚,没有阵列超出界限。

答案 2 :(得分:0)

不,你的字符指针现在指向长度为3的字符。通常这不会导致任何问题,但是你可能会覆盖一些关键的内存区域并导致程序崩溃(你可能会看到分段错误) 。特别是当您在大量内存上执行此类操作时

答案 3 :(得分:0)

这是“strcpy”

的实现
char *strcpy(char *strDestination, const char *strSource)
  {
  assert(strDestination && strSource);
  char *strD=strDestination;
  while ((*strDestination++=*strSource++)!='\0')
  NULL;
  return strD;
  }

你应该确保目的地有足够的空间。但是,它是什么,它是。

答案 4 :(得分:0)

在复制strSource之前,

strcpy没有检查strDestination中是否有足够的空间, 此外,它不执行边界检查,因此可能会超出或超出。它是缓冲区溢出的潜在原因。