我是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);
任何人都可以解释为什么会这样吗?感谢
答案 0 :(得分:5)
如果源和目标内存块重叠,则必须使用memmove
而不是memcpy
。
答案 1 :(得分:5)
您告诉memcpy()
复制69141077字节的数据。这看起来比你在offset
中实际分配的大小要大得多(除非那些字符串真的巨大)。
所以,这是一个缓冲区溢出。在分配msg->content.value->datasize
时,请检查offset
的内容是否与您计算的大小相符。
答案 2 :(得分:0)
memcpy()
的手册页说:
memcpy()函数将n个字节从内存区域s2复制到内存 区域s1。如果s1和s2重叠,则行为未定义。应用程序 其中s1和s2可能重叠应该使用memmove(3)代替。