6

我是 c 编程新手,我正在编写一个简单的客户端服务器应用程序。我收到这条消息:

 Source and destination overlap in memcpy(0x41f0beb, 0x41f0258, 69141077)
    ==9522==    at 0x402D9A9: memcpy (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
    ==9522==    by 0x8049C13: message_to_buffer (message.c:92)

下面是具体代码:

case CT_ENTRY://100
{
    int c=(2+2+4+strlen(msg->content.entry->key)-1+4+4+strlen(msg->content.entry->value->data));
    char *offset=malloc(c);
    *msg_buf=offset;
    memcpy(offset,&opcode,2);
    offset+=2;
    memcpy(offset,&ctype,2 );
    offset+=2;
    int ks=strlen(msg->content.entry->key);
    int ksc=host_to_net(ks);
    memcpy(offset,&ksc,4);
    offset+=4;
    memcpy(offset, msg->content.entry->key, ks);
    offset+=ks;
    int l=host_to_net(get_time());
    memcpy(offset,&l,4);
    offset+=4;
    int ds=host_to_net(msg->content.entry->value->datasize);
    memcpy(offset,&ds,4);
    offset+=4;

    // this line here!
    memcpy(offset,msg->content.entry->value->data, msg->content.value->datasize);

    return c;
    break;

违规行是

memcpy(offset,msg->content.entry->value->data, msg->content.value->datasize);

谁能解释为什么会这样?谢谢

4

3 回答 3

5

如果源和目标内存块重叠,您必须使用memmove而不是。memcpy

于 2012-12-05T10:34:18.627 回答
5

memcpy()要复制 69141077 字节的数据。这看起来比您实际分配的大小要大得多offset(除非这些字符串真的很大)。

所以,这是一个缓冲区溢出。msg->content.value->datasize在分配offset.

于 2012-12-05T10:39:59.997 回答
1

手册页memcpy()说:

memcpy() 函数将 n 个字节从内存区域 s2 复制到内存区域 s1。如果 s1 和 s2 重叠,则行为未定义。s1 和 s2 可能重叠的应用程序应该使用 memmove(3) 代替。

于 2012-12-05T10:41:49.697 回答