dangling_ptr.c
#include <stdio.h>
int main(void) {
int *ptr;
ptr = (int *)malloc(sizeof(int));
*ptr = 1;
printf("%d\n", *ptr);
free(ptr);
*ptr = 2; // 해제된 메모리 영역에 접근
}
dangling_ptr.ll
%1 = alloca i32*, align 8
%2 = call i8* @malloc(i64 4)
%3 = bitcast i8* %2 to i32*
store i32* %3, i32** %1, align 8
%4 = load i32*, i32** %1, align 8
store i32 1, i32* %4, align 4
%5 = load i32*, i32** %1, align 8
%6 = load i32, i32* %5, align 4
%7 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %6)
%8 = load i32*, i32** %1, align 8
%9 = call i32 (i32*, ...) bitcast (i32 (...)* @free to i32 (i32*, ...)*)(i32* %8)
%10 = load i32*, i32** %1, align 8
store i32 2, i32* %10, align 4
ret i32 0
1) alloca로 로컬 변수 %1 스택 메모리 할당
2) malloc 함수 call하고, 그 리턴값 %2에 저장
3) malloc 리턴 값의 타입은 i8*, (int 32비트 포인트 변수에 저장하려면) i32* 타입으로 bitcast
4) store로 %3 값에 %1 값 저장 (즉, malloc 리턴 값 저장)
5) 임시 변수 %4에 %1에 있는 값 가져와 저장
6) store로 %4 값에 1 값 저장
7) 임시 변수 %6에 %5에 있는 값 가져와 저장 (align 4)
8) 임시 변수 %4에 %1에 있는 값 가져와 저장 (align 8)
9) printf 함수 호출, 이때 %6의 값이 인자로 넘어감
10) 임시 변수 %8에 %1에 있는 값 가져와 저장
11) free 함수 호출
12) 임시 변수 %10에 %1에 있는 값 가져와 저장
13) store로 %10 값에 2 값 저장