Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6205
  • 博文数量: 4
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 40
  • 用 户 组: 普通用户
  • 注册时间: 2015-06-01 14:12
文章分类

全部博文(4)

文章存档

2015年(4)

我的朋友
最近访客

分类: LINUX

2015-06-10 01:09:25

在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的时候先去链表中找这个地址,对的上进行下一步...

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. //64bit GCC 4.9 ubuntu15.04 请关闭优化
  4. int main()
  5. {
  6.     long *pint[100];

  7.     int i=0;
  8.     for(i=0;i<100;i++) {
  9.         if((pint[i]=(long *)malloc(1))==NULL) {
  10.             exit(-1);
  11.         }

  12.     }
  13.     *pint[0]=0xAAAAAAAAFFFEFDFC;
  14.     *(pint[0]+1)=0xBBBBBBBBFFFEFDFC;
  15.     *(pint[0]+2)=0xCCCCCCCCFFFEFDFC;
  16.     //*(pint[0]+3)=0xDDDDDDDDFFFEFDFC;
  17.     //*(pint[0]+4)=0xEEEEEEEEFFFEFDFC;
  18.     //*(pint[0]+5)=0xFFFFFFFFFFFEFDFC;
  19.     //*(pint[0]+6)=0x33333333FFFEFDFC;
  20.     for(i=0;i<100;i++) {
  21.         printf("Is that OK? address is 0x%lx, data is 0x%lx\n",(unsigned long)pint[i],*(pint[i]));
  22.         printf("Is that OK? address is 0x%lx, data is 0x%lx\n",(unsigned long)(pint[i]+1),*(pint[i]+1));
  23.         printf("Is that OK? address is 0x%lx, data is 0x%lx\n",(unsigned long)(pint[i]+2),*(pint[i]+2));
  24.         printf("Is that OK? address is 0x%lx, data is 0x%lx\n",(unsigned long)(pint[i]+3),*(pint[i]+3));
  25.     }

  26.     getchar();
  27.     for(i=0;i<100;i++) {
  28.         printf("Free address is 0x%lx\n",(unsigned long)(pint[i]));
  29.         free(pint[i]);
  30.     }
  31.     return 0;
  32. }


阅读(464) | 评论(0) | 转发(0) |
0

上一篇:系统编程: ubuntu 15.04 getpid

下一篇:没有了

给主人留下些什么吧!~~