Payload (0x149007000:0x1490073ef) lies outside heap (0x149000000:0x14900700f)
CFLAGS = -Wall -O2 -g #-m32 로컬 컴퓨터에서 돌려보려 -m32 옵션 비활성화 // 32비트: 포인터 = 4바이트
// 64비트: 포인터 = 8바이트
#define WSIZE 4 /* 워드 및 헤더/푸터 크기 (바이트) */
#define DSIZE 8 /* 더블 워드 크기 (바이트) */
#define NEXT_FREEP(bp) (*(void **)((char *)(bp) + WSIZE)) // WSIZE = 4바이트
// 문제: 64비트에서 포인터는 8바이트인데 4바이트 사용
#define PRED_FREEP(bp) (*(void **)((char *)(bp)))
#define NEXT_FREEP(bp) (*(void **)((char *)(bp) + WSIZE)) // 64bit 환경에서 오류 발생
// 수정 전
#define NEXT_FREEP(bp) (*(void **)((char *)(bp) + WSIZE))
// 수정 후
#define NEXT_FREEP(bp) (*(void **)((char *)(bp) + DSIZE))
// 32비트에서는 두 개의 포인터(8바이트) + 헤더/푸터(8바이트) = 16바이트
if (size <= DSIZE)
asize = 2*DSIZE; // 16바이트로 증가
// 64비트에서는 두 개의 포인터(16바이트) + 헤더/푸터(8바이트) = 24바이트
if (size <= DSIZE)
asize = 3*DSIZE; // 24바이트로 증가
// 수정 전 남은 공간이 최소 블록 크기(16바이트) 이상이면 분할 수행
if ((csize - asize) >= (2*DSIZE)) {
}
// 수정 후 남은 공간이 최소 블록 크기(24바이트) 이상이면 분할 수행
if ((csize - asize) >= (3*DSIZE)) {
}
핵심: "작은 차이가 큰 문제를 만든다"