在memcpy中如何处理内存溢出?

时间:2011-08-16 07:56:36

标签: c memcpy

int main ()
{
    char *destination;
    char source[10] = "jigarpatel";
    destination = (char*) malloc(5);
    memcpy(destination, source, 10);
    printf("%s and size is %d", destination, strlen(destination));
    free(destination);
    return 0;
}

输出:

 jigarpatel and size is 10

问题:

这里我只分配了5个字节到目的地,但目的地长度是10,这是为什么?

其他字节存储在哪里?

嵌入式系统安全吗?是否有崩溃或分段错误的可能性?

我怎样才能发现这类错误?

另一个问题

看我正在写一个用户要求所需内存的库,库说要分配10个字节&然后用户malloc 10字节&将其指针传递给库。现在库存储了一些数据...现在看看库是否说要分配10个字节但是用户只分配了5个字节&将该指针指向库,然后我如何检测该用户没有malloc充足的内存。

4 个答案:

答案 0 :(得分:5)

这里我刚刚只分配了5个字节到目的地然后为什么目的地长度是10?

printf("%s and size is %d",destination,strlen(destination)); 

strlen()\0视为字符串的结尾,因此它会继续计数,直到它发现\0为止。这并不意味着destination分配了那么多内存。

您正在超出已分配内存的范围进行编写,幸运的是它不会崩溃,但确实是未定义行为。未定义的行为意味着任何事情都可能发生。行为无法解释,幸运的是你的程序不会崩溃。

其他字节存储在哪里?
其他字节会覆盖超出分配给destination的5个字节的其他内存分配。

嵌入式系统安全吗?任何崩溃或分段错误的机会?
安全。它会导致未定义的行为,如果幸运的话,它会起作用。

如何检测此类错误?
每个平台都有一些内存分析工具,如Linux / Unix的 Valgrind ,你可以使用它们,并指出这些内存超量。

答案 1 :(得分:4)

这有时会发生,但在任何系统上都绝对不安全。你正在写malloc给你的结尾。从C的角度来看它是非法的,但从操作系统的角度来看它可能没问题(内存可能被分配了足够的权限)。

另一个问题是,如果您稍后再次调用malloc,它可能会给您一些内存,包括您正在使用的5个字节而不询问。这应该提供一些interesting debugging个会话。

  

这里我只分配了5个字节到目的地然后仍然为什么   目的地长度是10。?

目标只分配了5个字节,但由于malloc在您的系统上的工作方式,这不会导致写入无效,因为它恰好位于有效页面内。

  

存储其他字节。?

在前5名之后,暂时。

  

嵌入式系统是否安全?任何崩溃或分割的机会   故障。?

在任何系统中都不安全。很多崩溃的机会。

  

我怎样才能发现这类错误。?

使用valgrind或任何内存调试器。可以找到对valgrind的温和介绍here.

¹ 例如,在Linux(Glibc)上,小的(~64字节)malloc请求来自称为“fastbins”的一小部分预分配页面。每个fastbin具有固定的大小,因此使用直到该大小的分配的fastbin不会触发分段违规。有关如何发生这种情况的详细信息可以here,找到,以便更严格地处理您可能会引用的主题the malloc source code.

答案 2 :(得分:1)

不,它不安全 - 写入超出已分配块的末尾通常会导致堆损坏。

使用valgrind等工具来捕获此错误和其他类型的错误。

答案 3 :(得分:0)

幸运的是它没有崩溃。 memcpy的第三个参数应为4,然后你应该将空字符放在5位置以终止字符串。