64비트 환경 malloc-lab 오류 해결: 명시적 가용 리스트 구현
AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

[TIL/크래프톤 정글9기] 52일차 (C/명시적 가용 리스트 구현 시 오류 해결)

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

개발 툴

대상자

  • 대상자_정보: C 언어 및 메모리 관리 기술을 다루는 개발자
  • 난이도: 중급 (포인터 크기, 메모리 할당 전략 이해 필요)

핵심 요약

  • 64비트 환경에서 32비트 코드 실행 시 포인터 크기 차이로 인한 malloc-lab 오류 발생
  • DSIZE 기준 최소 블록 크기 조정 (2DSIZE3DSIZE) 및 분할 조건 수정
  • 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 기준 최소 블록 크기와 분할 조건을 재설정해야 함
  • "작은 차이가 큰 문제를 만든다"는 교훈을 바탕으로, 시스템 이식 시 모든 환경 파라미터를 철저히 검토해야 함