堆溢出的概念是指有任何方法使写入的内容可以溢出堆块申请的内存从而影响到下个堆块中的内容,那么首先我们要学会计算堆块大小
/* pad request bytes into a usable size -- internal version */
//MALLOC_ALIGN_MASK = 2 * SIZE_SZ -1
#define request2size(req) \
(((req) + SIZE_SZ + MALLOC_ALIGN_MASK < MINSIZE) \
? MINSIZE \
: ((req) + SIZE_SZ + MALLOC_ALIGN_MASK) & ~MALLOC_ALIGN_MASK)
上面是堆块大小的预定义,实际上ptmalloc分配内存是以双字为基本单位的。64位系统为例,分配的空间是16的整数倍,即用户申请的chunk都是16字节对齐的。request2size的作用就是计算堆块大小,其中SIZE_SZ = 8,MINSIZE = 0x10,req就是自己请求的大小。
注意用户区域的大小不等于 chunk_head.size,chunk_head.size = 用户区域大小 + 2 * 字长