[TIL/크래프톤 정글9기] 52일차 (C/명시적 가용 리스트 구현 시 오류 해결)
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
개발 툴
대상자
- 대상자_정보: C 언어 및 메모리 관리 기술을 다루는 개발자
- 난이도: 중급 (포인터 크기, 메모리 할당 전략 이해 필요)
핵심 요약
- 64비트 환경에서 32비트 코드 실행 시 포인터 크기 차이로 인한
malloc-lab
오류 발생 DSIZE
기준 최소 블록 크기 조정 (2DSIZE
→3DSIZE
) 및 분할 조건 수정mm_malloc()
및place()
함수 내 메모리 할당 로직 수정 필수
섹션별 세부 요약
1. 문제 현상
- 오류 메시지:
Payload (0x149007000:0x1490073ef) lies outside heap (0x149000000:0x14900700f)
- 발생 환경: AWS EC2 Ubuntu 22.04 64비트 시스템
- 기존 코드 문제:
-m32
옵션 비활성화로 인한 32비트 코드 실행
2. 원인 분석
- 포인터 크기 차이:
- 32비트: 포인터 = 4바이트
- 64비트: 포인터 = 8바이트
- 메모리 구조 불일치:
- 32비트: 헤더/푸터 + 2포인터 = 16바이트
- 64비트: 헤더/푸터 + 2포인터 = 24바이트
3. 해결 방법
- 매크로 수정:
```c
if (size <= DSIZE) asize = 3*DSIZE; // 24바이트로 증가
```
- 블록 분할 조건 변경:
```c
if ((csize - asize) >= (3*DSIZE)) { // 24바이트 기준 분할 수행
```
- 테스트 환경 설정:
CFLAGS
에서-m32
옵션 제거
4. 학습 요약
- 64비트 이식 시 포인터 크기 고려 필수
- 최소 블록 크기 계산 오류로 인한 메모리 누수/분할 오류 가능성
- 환경 변경 후 단위 테스트 및 통합 테스트 필수
결론
- 64비트 환경에서 메모리 할당 구현 시 포인터 크기(4바이트 ↔ 8바이트)와 메모리 구조 차이를 반드시 고려하고,
DSIZE
기준 최소 블록 크기와 분할 조건을 재설정해야 함 - "작은 차이가 큰 문제를 만든다"는 교훈을 바탕으로, 시스템 이식 시 모든 환경 파라미터를 철저히 검토해야 함