【问题标题】:Why does strcpy "work" when writing to malloc'ed memory that is not large enough? [duplicate]为什么 strcpy 在写入不够大的 malloc 内存时会“工作”? [复制]
【发布时间】:2012-04-12 17:40:04
【问题描述】:

可能重复:
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。这不应该抛出诸如 index out of bounds 之类的东西吗?

【问题讨论】:

  • 这就是伟大的“缓冲区溢出!!”的原因:P

标签: c++ c


【解决方案1】:

C 和 C++ 不像 Java 和 C# 那样进行自动边界检查。此代码将覆盖字符串末尾之后的内存中的内容,从而破坏那里的所有内容。这可能会导致以后出现奇怪的行为或崩溃,因此最好对此类事情保持谨慎。

访问数组末尾之后被 C 和 C++ 标准视为“未定义行为”。这意味着该标准没有指定程序执行此操作时必须发生什么,因此触发 UB 的程序处于可能发生任何事情的永远不会发生的地方。它可能会继续工作而没有明显的问题。它可能会立即崩溃。当做其他不应该成为问题的事情时,它可能会在稍后崩溃。它可能行为不端,但不会崩溃。或者迅猛龙可能会来吃你。任何事情都有可能发生。

顺便说一句,写在数组末尾之后称为buffer overflow,这是安全漏洞的常见原因。如果该“abc”字符串实际上是用户输入,那么熟练的攻击者可以将字节放入其中,最终覆盖函数的返回指针之类的东西,这可用于使程序运行与它应该运行的代码不同的代码,并做不同的事情它应该。

【讨论】:

    【解决方案2】:

    你只是重写堆内存,通常不会崩溃,但以后可能会发生坏事。 C 不会阻止你踢自己的脚,没有数组越界。

    【讨论】:

    • 但这是否会在堆上进行自动内存分配,而之前分配的 2 个字节会丢失?
    • 您在不属于您的堆上写入了 2 个字节,因此任何事情都可能发生,您正在运行的进程的完整性现在存在问题,您可能会崩溃或结果不佳或什么都没有稍后发生。
    • @Programmer:您的问题的两个部分的答案都是。您的代码只是覆盖了您分配的块末尾的内存。如果你幸运的话,它会很快崩溃,让你知道有一个错误。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

        这里是“strcpy”的实现

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

      您应该确保目的地有足够的空间。然而,它是什么,它就是。

      【讨论】:

        【解决方案5】:

        strcpy 在复制 strSource 之前不会检查 strDestination 中是否有足够的空间, ALso 它不执行边界检查,因此存在超出或超出的风险。这是缓冲区溢出的潜在原因。

        【讨论】:

          猜你喜欢
          • 2017-05-26
          • 1970-01-01
          • 2019-02-06
          • 1970-01-01
          • 1970-01-01
          • 2019-11-18
          • 2014-04-24
          • 2018-07-21
          • 1970-01-01
          相关资源
          最近更新 更多