ptmalloc - 如何让其崩溃
我的上一篇文章写的是malloc的最终章,那么你是不是猜下一篇就是写free,我也是这样想的,然而。。。并不是,free的代码我大概扫了一下,实在是名不符其实。真令我失望的free,干脆下次再写把。这次我写些可以玩崩malloc的代码。
sbrk
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <malloc.h>
#include <unistd.h>
#include <errno.h>
int main(void)
{
void *first = malloc(32);
void *second = malloc(10240);
malloc_stats();
if (sbrk(-10240) == NULL) {
perror("sbrk");
return -1;
}
void *third = malloc(131040);
malloc_stats();
free(first);
free(second);
free(third);
return 0;
}
效果
Segment fault
原因
malloc申请内存是通过sbrk和mmap,sbrk是通过增长program break,那么,如果你sbrk(-size),就等于缩减program break,malloc访问到已经释放的段,肯定会挂的。
你可能在想,那我sbrk(size),不缩减行么,可以倒是可以,malloc里面会处理sbrk后断开的情况。
建议
malloc和sbrk尽量不要同时使用。