2017-03-15 21 views
0

GFlags를 사용하는 작은 응용 프로그램에서 페이지 힙을 사용하려고하지만 어떤 이유로 작동하지 않습니다.Windows GFlags 응용 프로그램에서 힙 손상 감지

int* a; 
a= (int*)malloc(1); 
*a= 8888800; 
return 0; 

이 코드를 실행하는 응용 프로그램이 충돌하지 않습니다

나는 않습니다 모두가 힙 메모리 손상 작은 C의 ++ 응용 프로그램을 작성했습니다. 하지만 페이지 힙을 사용하면 세 번째 줄에서 예상 할 수 있습니다.

나는 GFlags를 올바르게 활성화하지 않았지만 문제를 파악할 수 없다고 생각합니다. 이미지 파일 탭에서 GFlags exe를 실행 한 후 내 EXE 경로를 복사하고 페이지 힙 사용 및 예외 옵션 중지를 표시했습니다. 나는 CMD를 체크하고 페이지 힙이 활성화 된 것을 보았다. 무엇이 문제 일 수 있습니까?

+1

* 동작이 정의되지 않았습니다. 당신이 UB를 가지고있을 때 일어나는 일은, 잘 정의되지 않은 * 것이고, 당신은 그것을 예측할 수 없습니다. 어떤 경우에는 잘 작동하는 것처럼 보일 수도 있고, 충돌 할 수도 있으며, 때로는 비강 악마 (http://catb.org/jargon/html/N/nasal-demons.html)를 얻을 수도 있습니다. 이것은 또한 왜 C++에서'malloc'을 사용하지 말아야하는지에 대한 좋은 예입니다. –

+0

GFlags가 작동한다는 것을 증명할 수있는 방법이 있습니까? –

+0

@Someprogrammerdude : 언어를 남용하는 정의되지 않은 동작이 아닙니까? 컴파일러가 정확히 무엇을해야하는지 알고 있기 때문에 이것은 IMHO C++ 언어 남용이 아닙니다. 따라서 문제는 Windows가 메모리 관리를 통해이 사건을 처리하는 방법입니다. 컴파일러는'malloc()'에 의해 할당 된 바이트 수를 알 수 없다. 매개 변수 '1'이 1KB를 의미하면 모든 것이 정상입니다. –

답변

2

페이지 힙은 변수가있는 페이지 다음에 보호 된 페이지가 있음을 의미합니다. 이는 충돌을 방지하기 위해 보호 된 페이지의 메모리에 액세스해야 함을 의미합니다. 당신은 페이지의 끝에 도달하기에 충분한 데이터를 쓰고 있지 않습니다. 작동해야

int* a; 
a= (int*)malloc(1); 
*(a+4096)= 8888800; 
return 0; 

같은

뭔가 (테스트되지 않음).

힙의 모든 단일 변수는 페이지 힙이 켜져있을 때 8KB의 메모리가 필요합니다. 변수가있는 액세스 가능한 페이지의 경우 4KB, 뒤 따르는 보호되는 페이지의 경우 4KB입니다.

그래서 페이지 힙은 프로덕션 응용 프로그램에는 적합하지 않지만 작은 테스트 응용 프로그램에는 적합하지 않습니다. 여기서 버퍼 오버 플로우 (또는 언더런)를 해결해야합니다.