사용범위
Windows, Unix 등 모든 OS에서 사용가능한 표준 API 함수
기능
C언어 표준 함수로 할당받은 동적메모리(Heap Memory)를 해제하기 위해 사용한다.
헤더
#include <stdlib.h>
※ 함수 사용시 stdlib.h 파일을 include 하지 않는다면 컴파일 시 error 발생 ※
함수
void free(void* memory);
파라미터
- void* memory
반환값
free 함수는 반환값이 없지만 정상적인 경우 heap memory가 반환된다.
만약 실패시 signal 이 발생할 수 있다.
잡학지식
free 를 하여 해제한 heap memory 를 재사용하게 될 경우 아주 큰 문제가 발생할 수 있다.
과거에는(비교적 최근) free 를 하고 난 이후 동일한 크기의 heap memory를 요청하면 내부 알고리즘에 따라 동일한 영역의 heap memory를 재할당해 주는 경우가 있다. (First-Fit 알고리즘 → OS, Compiler 버전에 따라 다름)
이렇게 되면 heap memory 를 오염시켜 공격자가 원하는 행위를 할 수 있는 UAF(Use After Free) 취약점에 노출이 되기 때문이다. (공격자가 free 한 heap memory를 오염시켜 재사용하는 소프트웨어를 통해 exploit 을 실행할 수 있다.)
이 점을 악용하여 UAF(Use After Free) 공격을 하는 exploit 이 아주 많이 있었고, 현재까지도 종종 나오고 있는 중이다.
(다행인 점은 최근에 나오는 Compiler 와 OS 들은 이 같은 취약점을 해결하였다고 한다.)
하지만 여전히 오래된 버전의 소프트웨어를 사용하는 환경이 있기 때문에 이러한 취약점에 노출된 서버가 상당히 많다.
따라서 제일 좋은 방법은 최신 소프트웨어, sdk 등을 사용하는것이다. 만약 현실적으로 오래된 버전의 소프트웨어를 패치할 수 없다면 free 한 pointer를 반드시 NULL 로 초기화하는 습관을 가져야한다.
(자세한 내용은 아래 포스팅을 참고)
[C언어] 댕글링 포인터와 와일드 포인터 (Dangling pointer & Wild pointer)
와일드 포인터 (Wild Pointer) Wild Pointer(야생의 포인터). 단어의 의미 그대로 초기화가 안돼서 쓰레기값으로 채워진 포인터를 의미한다. 단어의 정의를 처음 볼 수도 있지만 포인터를 배울 때 가장
hackerpark.tistory.com
<소스 코드>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define HEAP_SIZE 32
int main() {
char *heap_memory = NULL;
heap_memory = (char *)calloc(HEAP_SIZE, sizeof(char));
if(heap_memory == NULL) {
printf("calloc failed\n");
abort();
}
strncpy(heap_memory, "Hello Free", HEAP_SIZE - 1);
printf("%s\n", heap_memory);
free(heap_memory);
heap_memory = NULL;
return 0;
}
※ 실행 결과
Hello Free
'C언어 > stdlib.h' 카테고리의 다른 글
[C언어] abs 함수 (정수의 절대값 구하기) (0) | 2023.03.29 |
---|---|
[C언어] realloc (heap 메모리 크기 변경) (0) | 2023.03.28 |
[C언어] calloc 함수 (초기화된 heap 메모리 할당) (0) | 2023.03.02 |
[C언어] malloc 함수 (heap 메모리 할당) (1) | 2023.03.01 |
[C언어] abort 함수 (프로그램 중단, 비정상 종료) (0) | 2023.03.01 |