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);
}

这指定36dwSizeBytes缓冲区中的最后两个字节保留为 NULL,以便缓冲区以 NULL 终止。但是,在应用程序验证程序下,当我尝试std::wstring从缓冲区构造 a 时,这会导致崩溃。

当我在 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(记住 unicode 字节被翻转,所以d0d0实际上是在fafa.

我看过这里:它向我展示了应用程序验证程序如何在分配后留下这些填充代码。但是fafa没有列出来,那是什么意思呢?为什么它会在memset应该清除的地方?

4

1 回答 1

1

I don't have a source for this at the moment, but one of the features AppVerifier does is completely fills your buffer with a pattern prior to invoking ReadFile. You request to read 38 bytes, AppVerifier fills your buffer with 38 bytes of pattern, and ReadFile only reads 36 bytes from the file. Thus your last 2 bytes are fill pattern rather than the expected NULL characters.

于 2013-02-26T17:42:58.640 回答