정적코드분석/코딩표준

Use after free (메모리 해제 후 사용) 에러

이번에 소개할 오류는 Use after free (할당된 메모리 해제 후 사용) 에러입니다. 해제된 메모리를 다시 사용하려고 할 때 발생하는 에러이며, 정적분석도구에서 보통 ‘Use After Free’ 라는 내용으로 경고 합니다.

자유
요런 자유 2번이면 프로그래밍 에러라는 것이지요…

이 에러는 직관적으로 알아차릴 수 있고, 프로그래머가 신경을 많이 쓰는 메모리 할당/해제 부분이라서 발생빈도는 크지 않습니다. 게다가 기술적으로 이해하기 쉽습니다. 한 번 Free 했던 것을 다시 사용하지 않으면 되니까요.

‘Use After Free’의 예

아래는 프로그래밍 관련 ‘지식인’격인 Q&A 사이트 – StackOverflow에서 누군가가 질문한 내용입니다.

int main(void) {
    int* p = (int*) malloc(sizeof(int));
    int* q = (int*) malloc(sizeof(int));
    *p = 10;
    *q = 20;
    p = q;
    printf(“%d %d”, *p, *q);
    free(p);
    free(q);
}

위 코드와 함께 왜 위의 코드에 ‘use after free’ 에러가 있는지 묻는 질문입니다. 아마 이를 물어본 사람은 새내기 프로그래머가 아니었을까 싶습니다. 6번째 줄 p = q 부분에서 p는 q의 주소를 덮어쓰게 된다. 즉 p와 q는 같은 주소를 가르키게 됩니다. 이어 8번째 줄에서 p를 메모리 해제하면 q의 주소 역시 해제하게 됩니다. 이 상태에서 다시 q의 메모리 해제하려고(즉 사용하기 때문에) 하기 때문에 ‘use after free’ 에러가 발생하는 것입니다.

참고로 위 코드는 ‘use after free’ 에러 외에 메모리 누수(Memory Leak)이 발생합니다. 기존에 할당된 p에 접근할 방법이 사라졌기 때문입니다.

Leave a Reply

Your email address will not be published. Required fields are marked *