在malloc中,可以将分配给int指针的size设为1,那么我们给指针赋值时很显然会导致占用了未分配的内存。但是实际上进行连续分配时,如果分配空间小于24,那么后续指针+0x20,如果大于24,则增加0x30.
下面的代码是进行越界分配的一个实验
定义指针数组,依次分配,为pint[0]进行越界赋值,这并没有什么问题。但是在free的时候,如果第19行注释取消,那么对pint[0]的free会出错。此时对应的占用了32个字节。如果只越界分配24个字节,那么free是没有问题的。
这里面的机制是怎样的呢?尤其是free的机制。
20150616 update
1: 在网上看到malloc的块中有额外的数据结构来记录这个块的信息。也难怪因为把这个块全部给占满后使free出错了。check一下块里面的数据是啥样子!
a 在malloc返回地址的前8个字节中装有一个数据,在下面程序的条件下,这个数字是0x21。
如果改为0,1 invalid pointer
如果改为2,3,6,7 pass
b 如果free一个不是malloc得来的地址,肯定会出错。
malloc会保有一个分配链表,即起始地址和size,那么1 glibc应该是在一个共享的地址空间里面,因为这些还需要被进程单独加载的话速度会略慢么?
还是看源代码么?那么free的时候先去链表中找这个地址,对的上进行下一步...
-
#include <stdio.h>
-
#include <stdlib.h>
-
-
//64bit GCC 4.9 ubuntu15.04 请关闭优化
-
int main()
-
{
-
long *pint[100];
-
-
int i=0;
-
for(i=0;i<100;i++) {
-
if((pint[i]=(long *)malloc(1))==NULL) {
-
exit(-1);
-
}
-
-
}
-
*pint[0]=0xAAAAAAAAFFFEFDFC;
-
*(pint[0]+1)=0xBBBBBBBBFFFEFDFC;
-
*(pint[0]+2)=0xCCCCCCCCFFFEFDFC;
-
//*(pint[0]+3)=0xDDDDDDDDFFFEFDFC;
-
//*(pint[0]+4)=0xEEEEEEEEFFFEFDFC;
-
//*(pint[0]+5)=0xFFFFFFFFFFFEFDFC;
-
//*(pint[0]+6)=0x33333333FFFEFDFC;
-
for(i=0;i<100;i++) {
-
printf("Is that OK? address is 0x%lx, data is 0x%lx\n",(unsigned long)pint[i],*(pint[i]));
-
printf("Is that OK? address is 0x%lx, data is 0x%lx\n",(unsigned long)(pint[i]+1),*(pint[i]+1));
-
printf("Is that OK? address is 0x%lx, data is 0x%lx\n",(unsigned long)(pint[i]+2),*(pint[i]+2));
-
printf("Is that OK? address is 0x%lx, data is 0x%lx\n",(unsigned long)(pint[i]+3),*(pint[i]+3));
-
}
-
-
getchar();
-
for(i=0;i<100;i++) {
-
printf("Free address is 0x%lx\n",(unsigned long)(pint[i]));
-
free(pint[i]);
-
}
-
return 0;
-
}
阅读(464) | 评论(0) | 转发(0) |