C++探索Heap Corruption

        前少龙写序的时段,一不小心引发了Heap
Corruption,但是只是找来了引起问题之代码,并形容进行了修正,没有工夫错开深入之探赜索隐一番,在博客上勾画了首随笔,有些朋友留了若干评论,让自己万分感惭愧,这样一个题材为什么非失深入探索一番为,不克给它们延续当一个歪曲的定义在自己的脑子里了,故而今天研究了转,有些收获,拿出去分享。

        首先说明一下什么是Heap
Corruption。当输入超出了预分配的半空中大小,就会见蒙该空间之后的一模一样段子储存区域,这虽为Heap
Corruption。这一般为为作为黑客攻击的均等种手段,因为若以该空间之后的那段存储区域设是于重要的数量,就足以运用Heap
Corruption来将这些数据修改掉了,后果当然可想而知了。

        在VC里面,用release模式编译运行程序的时刻,堆分配(Heap
allocation)的早晚调用的凡malloc,如果你如果分配10byte之空中,那么即便会见仅仅分红10byte上空,而之所以debug模式之上,堆分配调用的凡_malloc_dbg,如果您只要分配10byte底上空,那么它见面分配产生除了您要是的10byte以外,还要多出约36byte上空,用于存储一些薄记信息,debug堆分配出来之后就会见按照顺序并成一个链条。

       
那么我们重来探望薄记信息被来头什么。还是点10byte分配上空的例证,那么分配来底10byte空中的前方会时有发生一个32byte之叠加信,存储的是一个_CrtMemBlockHeader结构,可以在DBGINT.H中找到该组织的概念:

typedef struct _CrtMemBlockHeader
{
// Pointer to the block allocated just before this one:
   struct _CrtMemBlockHeader *pBlockHeaderNext;
// Pointer to the block allocated just after this one:
   struct _CrtMemBlockHeader *pBlockHeaderPrev;
   char *szFileName;    // File name
   int nLine;                  // Line number
   size_t nDataSize;      // Size of user block
   int nBlockUse;         // Type of block
   long lRequest;          // Allocation number
// Buffer just before (lower than) the user’s memory:
   unsigned char gap[nNoMansLandSize];
} _CrtMemBlockHeader;

/* In an actual memory block in the debug heap,
 * this structure is followed by:
 *   unsigned char data[nDataSize];
 *   unsigned char anotherGap[nNoMansLandSize];
 */

布局面临的_CrtMemBlockHeader结构简单个指针就不要讲是干嘛的了,szFileName是储存的倡议分配操作的那行代码所在的文本的不二法门和称,而nLine则是行号。nDataSize是请分配的分寸,我们的例子里当就是10了,nBlockUse是种,而lRequest是请求号。最后一件gap,又如NoMansLand,是4byte(nNoMansLandSize=4)大小的如出一辙截区域,注意看最终几行注释就知晓了,在这个组织后面和的是用户真正用之10byte数区域,而那个后还和了一个4byte之Gap,那么也就是说用户申请分配的区域是让一个条结构,和一个4byte的gap包起来的。在纵这10byte空间的上,会检查这些信。Gap被分配后会受以0xFD填充。检查着如果gap中的值变化了,就见面以Assert
fail的章程报错。不过vc6受到提拔的较难以掌握,DAMAGE :after Normal
block(#dd) at 0xhhhhhhhh,而vs2005内部会唤起Heap Corruption
Detected!而使你是release版本,那么这荒唐就会暗藏直到其的破坏力发生作用。也许下的区域存储方一个除数,而而的heap
corruption把它改变写成了0,那么会什么呢? 😛
       
至于其他的C/C++编译器中是不是会见来如此的建制,我就算无是死亮了,或许知道之爱侣可让自己开些补充。

http://www.cppblog.com/kerlw/archive/2009/06/10/21700.html