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()関数は、メモリ領域s2からメモリ領域s1にnバイトをコピーします。s1とs2が重複している場合、動作は定義されていません。s1とs2が重複する可能性のあるアプリケーションでは、代わりにmemmove(3)を使用する必要があります。

于 2012-12-05T10:41:49.697 に答える