(C/C++)의 동적 할당과 Memory leak
이게 아주 중요한 이슈인데, memory leak은 구조체, 포인터의 배열 등 동적 할당 받은 공간이 또 다른 동적 할당 받은 더 큰 공간의 entry가 될 때 자주 발생한다. 다음과 같이 단순한 경우는 그냥 해제 해주면 그만이다.
1
2
3
4
void normal() {
void \*foo = malloc(4);
free(foo);
}
근데 문제는 다음과 같은 상황이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
typedef struct \_ {
int \*record[3];
} Bucket;
Bucket \*bucket;
void insertEntry() {
int \*foo = (int\*)malloc(sizeof(int));
\*foo = 1;
bucket->record[0] = foo;
}
void leak() {
bucket = (Bucket\*)malloc(sizeof(Bucket));
insertEntry();
printf("%d", \*(bucket->record[0]));
free(bucket->record[0]); // !! 이거 빼먹으면 leak !!
free(bucket);
}
bucket
이 가지고 있는 entry도 동적 할당 받은 공간을 가리키는 포인터이므로, 이 걸 먼저 free()
해 준 다음 버킷을 free()
해야 한다. 근데 프로그램이 복잡해 지는 경우 이를 잊어버리는 경우가 종종 있어 memory leak으로 이어진다. 왜 그렇냐?는 glibc malloc 코드 보면서 gdb로 heap chunk가 어떻게 할당되고, 어떻게 회수되는지를 조사해보면 알 수 있는데, 직접 하기 귀찮거나 하는 법도 모르겠다면 다음 내용을 읽어보면 도움이 될 것이다.
2017/07/19 - [System/Exploit] - [glibc] malloc - 1
2017/07/19 - [System/Exploit] - [glibc] malloc - 2
This post is licensed under CC BY 4.0 by the author.