0

私のプログラムはアプリベリファイアでクラッシュしていますが、クラッシュを完全には理解していません。ファイルのバイト数から動的に割り当てられるバッファがあります。

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  }...............

これは、私のバッファがいっぱいになったことを示していますがReadFileNULLが残っているはずでbuf[36]あり、buf[37](memsetを思い出してください)アプリベリファイアのフィルコードがありますfafa(ユニコードバイトが反転しているのでd0d0、実際にはの後にありfafaます。

私はここを見てきました:これは、アプリベリファイアが割り当て後にこれらのフィルコードを残す方法を示しています。しかしfafa、リストされていないので、それはどういう意味ですか?memsetそして、なぜそれはクリアされるべき場所にあるのですか?

4

1 に答える 1

1

現時点ではこれに関するソースはありませんが、AppVerifier が行う機能の 1 つは、ReadFile を呼び出す前にバッファをパターンで完全に埋めることです。38 バイトの読み取りを要求すると、AppVerifier はバッファーを 38 バイトのパターンで満たし、ReadFile はファイルから 36 バイトのみを読み取ります。したがって、最後の 2 バイトは、予想される NULL 文字ではなく、塗りつぶしパターンです。

于 2013-02-26T17:42:58.640 に答える