ptmalloc - 如何讓其崩潰

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儘量不要同時使用。

(以後繼續補充)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章