double free的小程序

loe 2018-11-02 08:34:54
程序如下

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{

char *p1 = (char*)malloc(210);
if(p1 != NULL)
{
printf("malloc(210) succeeded\n");
}
if(p1 == memset(p1,0,300))
{
printf("memset(p1,0,300) succeeded\n");
}
free(p1);
printf("Now char *p2 = (char*)malloc(210)\n");
char *p2 = (char*)malloc(210);
if(p2 != NULL)
{
printf("memset(p2,0,210) succeeded\n");
}
else
{
printf("memset(p2,0,210) failed\n");
}
return 0;
}

程序首先申请210Bytes ,指针为p1, 之后越界 memset,在之后free(p1);
报出的错误是double free or corruption (!prev): 0x00000000018bb010 ***
我想问下为什么会报出这个错误,虽然memset越界了(300bytes),但是 free的是210个字节,又有什么关系呢?
glibc是怎么判断double free的
...全文
88 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
云山大侠 2018-11-02
  • 打赏
  • 举报
回复
当你越界赋值操作时,没有报错。但是改变了这段数据的长度。(210 >>> 300),所以报错是在211这个地方出错的,本来时灭有的,你去free就成了double free。

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧