내 프로그램이 앱 검증기에서 충돌하고 있으며 충돌을 완전히 이해하지 못했습니다. dwSizeBytes
(나는 크래시 덤프에서 볼 수 있습니다)App Verifier 오류 패턴`fafa`의 의미는 무엇입니까?
DWORD dwSizeBytes = (DWORD)liSize.QuadPart+2;
TCHAR* JSONBufferW = new TCHAR [dwSizeBytes/sizeof(TCHAR)];
memset(JSONBufferW, 0, dwSizeBytes);
가 38
입니다 : 동적으로 파일의 바이트 수에서 이렇게 할당 된 버퍼를 가지고있다. 이후 나는 파일에서 일부 데이터를 읽어
if(!ReadFile(hFile, JSONBufferW, dwSizeBytes, &dwSizeBytes, NULL))
{
status = GetLastError();
TRACE_ERROR(g_hTrace, "ReadFile() failed for %S, error code=%d", strCompletePath, status);
}
이 36
버퍼가 NULL 종료되도록 버퍼 NULL의 마지막 2 바이트를 떠나 dwSizeBytes
에 할당합니다. 그러나 응용 프로그램 검증 자 아래에서 버퍼에서 std::wstring
을 생성하려고 시도하면 충돌이 발생합니다.
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 있어야하는데 : 나는 WinDBG에서의 버퍼의 할당 블록을 볼 때
는 나는이처럼 보이는 것을 알 수있다. 지금은 버퍼 보면 그것은 자기의 볼 :
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
합니다 (memset 함수를 기억) buf[36]
및 buf[37]
에 남아 있어야하는 곳이다 앱 검증이 그래서 d0d0
fafa
후 실제로 유니 코드 바이트 뒤집 기억 (코드 fafa
을 채우기
을 내가 here를 검토 한 :.. 응용 프로그램 검증이이 코드를 할당 한 후 그러나 fafa
가 표시되지 채우기 잎 어떻게 나에게 보여 주었다있는, 그래서 어떻게합니까 왜? 그리고 왜? memset
이 정리해야하는 곳입니까?
나는 디버깅을 잘 따르지 않는다는 것을 인정해야하지만, 내 눈을 사로 잡는 것은 새로운 TCHAR [dwSizeBytes/sizeof (TCHAR)]이다. 이 정수부는 *로 반올림되므로'dwSizeBytes'를 읽을 때'JSONBufferW'를 오버런시킵니다. 사실,'memset '조차도 할당 된 메모리 영역의 경계를 덮어 씁니다. – us2012
이 경우 'dwSizeBytes'는 짝수이고 sizeof (TCHAR)는 2이므로 좋은 점입니다. 그래야 정상입니다. 파일은 UTF16으로 가득 차 있기 때문에 실제로는 문제가되지 않아야합니다. – Benj
'ReadFile'과'wstring ctor' 사이에서 당신은 무엇을하고 있습니까? 'ReadFile' 다음에 버퍼 내용을 직접 확인 했습니까? 상식은'ReadFile'은 버퍼에 36 바이트 만 썼다는 것을 암시하지만 ReadFile이 나머지 버퍼 (마지막 두 바이트)를 수정하는 것을 금지하는 문서에서 문장을 찾을 수 없습니다. 그래서'ReadFile'을 호출하기 전에 dwSizeBytes를 36으로 설정할 때 어떤 결과가 나옵니까? –