Windows has triggered a breakpoint in Gate_debug_x64.exe.
This may be due to a corruption of the heap, which indicates a bug in Gate_debug_x64.exe or any of the DLLs it has loaded.
This may also be due to the user pressing F12 while Gate_debug_x64.exe has focus.
The output window may have more diagnostic information.
Unhandled exception at 0x776840f2 in Gate_debug_x64.exe: 0xC0000374: 힙이 손상되었습니다.
힙 관련 문제는 보통 DLL 라이브러리를 사용할 경우 문제가 발생합니다. 예를들면 EXE에서 할당한 메모리를 DLL에서 해제하려는 경우 또는 그 반대의 경우입니다. 하지만 지금 같은 경우는 동적라이브러리는 사용하지 않고 정적 라이브러리만 사용하는데도 힙 메모리 에러가 발생해서 어디서 부터 손을 대어야 할지 막막했습니다.
찾아낸 원인은 wcscpy_s 함수의 처리 로직이 문제가 되었습니다. 우선 유니코드 변수에 sizeof를 할 경우 그 값이 실제 메모리의 크기가 나옵니다. 즉 쉽게 설명하면 wchar_t temp[5] 를 선언하고 sizeof(temp)를 할 경우 wchar_t는 2바이트이기 때문에 10이란 값이 나옵니다.
가장 중요한 것이 wcscpy_s 메소드는 디버그 버전에서의 수행 시나리오는 소스 문자열을 복사한 후에 할당된 메모리의 나머지 부분을 0xfe라는 값으로 채웁니다. 즉 아래의 그림에서와 같이 dest 변수의 콜스택을 보면 'TEST'라는 문자 뒤의 내용들이 0xfe라는 값으로 채워진것을 볼수 있습니다. 그런데 실제 dest는 크기가 10인데 sizeof(dest)를 한 값은 20이 나와버려서 wcscpy_s 내부에서 dest 변수를 20만큼 0xfe로 채워 버린 겂니다. 즉 본인의 할당된 메모리 영역을 벗어난 곳에 데이터를 채운것이죠. 만약 넘어선 그 영역을 이미 다른 객체가 쓰고 있었다라고 하면 오류가 발생하는 것입니다.
|