Go의 메모리 안전성: 스레드 안전성 결여로 인한 위험

2025-07-25

이 글은 Go에서 메모리 안전성에 대한 일반적인 이해에 이의를 제기합니다. 저자는 단순한 메모리 안전성(예: 범위 밖 접근 방지)은 강력한 프로그램에 불충분하며, 진정한 안전성은 정의되지 않은 동작(UB)을 피하는 데 있다고 주장합니다. Go 프로그램 예시를 통해 `unsafe` 연산을 사용하지 않더라도 데이터 경쟁이 UB와 충돌을 일으킬 수 있음을 보여줍니다. 저자는 Go의 데이터 경쟁 처리가 충분히 엄격하지 않으며, 메모리 안전성 주장과 모순되어 Go 프로그램을 보안 취약성 위험에 노출시킨다고 주장합니다. 결론적으로 언어의 안전성은 이원적이지 않으며, 언어가 제공하는 안전성 보장과 트레이드오프를 이해하는 것이 중요하다고 강조합니다.

더 보기

포인터는 복잡하다 II: LLVM 최적화의 미묘한 버그

2025-02-02

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

더 보기