什么是Heap Corruption
堆破坏是内存破坏的一种,简单来说就是由于程序的错误导致堆内存被意外改写,典型的情况包括:
- 申请了N个Bytes的内存,却试图写入> N个Bytes的内容;
- 向已经释放的内存位置写入内容;
fFrameSize = pSearch01To - fpBuffer; // 在某种情况下会出现fFrameSize = 0xFFFFFFFC
memcpy(fTo, fpBuffer, fFrameSize); // 这里memcpy会发生什么?
Heap Corruption的危害
把不属于自己的内存块的内容改写掉,危害是很显然的。更要命的是,Heap Corruption的问题往往很难排查,因为:
- 每次运行表现出来的现象可能不一样;
- Debug版和Release版表现可能不一样;
- 问题暴露的地方和问题引入的地方可能相差很远,两者逻辑上没有必然联系;
PageHeap检测Heap Corruption的原理
PageHeap工具可以在运行时检测Heap Corruption,其基本原理是在我们分配的内存块前后加上一些额外信息,这些额外信息用以检测是否出现越界写的情况。PageHeap分为Full模式和Normal模式:
- Full模式:在我们分配的每个内存块尾上加一页non-accessible page。Full模式的好处是