2011-01-27 8 views
1

私はちょうど非常に特殊な問題に遭遇しました。 memcpyまたは=演算子を使用して、特定の符号なしint変数(他の符号なしint変数に問題はありません)に値を代入しようとすると、プログラムは実行時エラーでクラッシュします。 1つのプログラムを実行しているときに必ずしも発生するとは限りませんが、2つ目のインスタンスを実行すると常にそうなります。さまざまなことをコメントしてコードを徹底的にチェックしたので、値の割り当てが問題であることは間違いありません。符号なし整数に値を代入するときのランタイムエラー

事前に感謝します。 unsigned int型の変数に代入

DWORD WINAPI RecvFunc(void* lpParameter) 
{ 
    BYTE header[5]; 
    short size, datasize; // must be unsigned, changed to signed for testing 
    int num; 
    BYTE* data; 
    BYTE opcode; 

    while(true) 
    { 
    size = 0; 

    while(size < 5) 
    { 
     num = recv(sock, (char*)(header + size), 5 - size, 0); 

     if(num <= 0) 
     { 
     size = 0; 
     break; 
     } 

     //MessageBox(g_hwnd, "Header piece ok", "", MB_OK); 
     size += num; 
    } 

    if(size == 0) 
    { 
     //MessageBox(g_hwnd, "Header error", "", MB_OK); 
     continue; 
    } 

    opcode = header[0]; 
    memcpy(&datasize, header + 1, sizeof(datasize)); 

    if(datasize > 5) 
    { 
     data = new BYTE[datasize - 5]; 
    }else{ 
     data = NULL; 
    } 

    while(size < datasize) 
    { 
     num = recv(sock, (char*)(data + size - 5), datasize - size, 0); 

     //MessageBox(g_hwnd, "Packet post-recv", "", MB_OK); 

     if(num <= 0) 
     { 
     size = 0; 
     break; 
     } 

     size += num; 
    } 

    if(size == 0) 
    { 
     //MessageBox(g_hwnd, "Packet error", "", MB_OK); 
     delete[] data; 
     continue; 
    } 

    size -= 5; 

    //MessageBox(g_hwnd, "Received a command", "New cmd", MB_OK); 

    switch(opcode) 
    { 
     ... 
    } 

    if(data != NULL) 
    { 
     delete[] data; 
    } 
    } 
} 
+5

私たちが見ることができるコードが必要です。 – James

+0

おそらく破られた気化器 –

+0

私はオリジナルの投稿にコードを追加しました。これは別のスレッドです。 –

答えて

0

はあなたの問題の本当の原因ではない、私はあなたを確保することができます:)ほとんどの場合、あなたはあなたのプログラムのどこかのバッファオーバーフローを持っています。

関連する問題