포인터는 복잡하다 II: LLVM 최적화의 미묘한 버그
2025-02-02
이 글에서는 컴파일러 중간 표현(IR)의 정확한 의미론, 특히 안전하지 않은 포인터 조작을 허용하는 C, C++, Rust와 같은 언어의 중요성을 자세히 살펴봅니다. 저자는 언뜻 보기에는 정상적인 세 가지 LLVM 컴파일러 최적화 단계가 최종 프로그램의 동작을 초기 프로그램의 동작과 모순되게 만들 수 있음을 보여줍니다. 근본 원인은 포인터의 '출처'(provenance)입니다. 즉, 포인터는 메모리 주소 이상의 정보를 가지며, 계산 방법에 대한 세부 정보가 포함되어 있다는 것을 의미합니다. 따라서 정의되지 않은 동작(UB)에 대한 정확한 정의를 포함한 더욱 정확한 LLVM IR 사양이 필요합니다. 컴파일러 IR을 엄격한 사양을 가진 독립형 프로그래밍 언어로 취급하는 것이 이러한 문제를 해결하는 열쇠입니다.
개발
포인터 의미론