私のプログラムはアプリベリファイアでクラッシュしていますが、クラッシュを完全には理解していません。ファイルのバイト数から動的に割り当てられるバッファがあります。
DWORD dwSizeBytes = (DWORD)liSize.QuadPart+2;
TCHAR* JSONBufferW = new TCHAR [dwSizeBytes/sizeof(TCHAR)];
memset(JSONBufferW, 0, dwSizeBytes);
dwSizeBytes
(これはクラッシュダンプで確認できます)はどこにありますか38
。この後、ファイルからいくつかのデータを読み取りました。
if(!ReadFile(hFile, JSONBufferW, dwSizeBytes, &dwSizeBytes, NULL))
{
status = GetLastError();
TRACE_ERROR(g_hTrace, "ReadFile() failed for %S, error code=%d", strCompletePath, status);
}
これは、バッファの最後の2バイトをNULLのままにして、バッファがNULLで終了するように36
割り当てます。ただし、アプリベリファイアでは、後でバッファからdwSizeBytes
を構築しようとするとクラッシュが発生します。std::wstring
windbgでバッファの割り当てブロックを見ると、次のようになっていることがわかります。
0:022> dd 0x00000000`07560fd0-0x48 0x00000000`07560fd0
00000000`07560f88 00001000 00000000 abcdbbbb 00000000
00000000`07560f98 07191000 00000000 00000026 00000000
00000000`07560fa8 00001000 00000000 00000000 00000000
00000000`07560fb8 00000000 00000000 0025a230 00000000
00000000`07560fc8 00001000 dcbabbbb 0022007b
0x26
私のバッファのサイズが38であることに注意してください。今、私はそれが自己であるバッファを見て、見ます:
0:022> dc 0x00000000`07560fd0
00000000`07560fd0 0022007b 006f006d 00650064 003a0022 {.".m.o.d.e.".:.
00000000`07560fe0 006d0022 006e0061 00610075 0022006c ".m.a.n.u.a.l.".
00000000`07560ff0 000a007d d0d0fafa d0d0d0d0 d0d0d0d0 }...............
これは、私のバッファがいっぱいになったことを示していますがReadFile
、NULL
が残っているはずでbuf[36]
あり、buf[37]
(memsetを思い出してください)アプリベリファイアのフィルコードがありますfafa
(ユニコードバイトが反転しているのでd0d0
、実際にはの後にありfafa
ます。
私はここを見てきました:これは、アプリベリファイアが割り当て後にこれらのフィルコードを残す方法を示しています。しかしfafa
、リストされていないので、それはどういう意味ですか?memset
そして、なぜそれはクリアされるべき場所にあるのですか?