3.2 러스트 ‘안전성’의 정의, 경계, 그리고 한계

러스트의 ‘안전성’은 포괄적인 ‘무결점(bug-free)’을 의미하는 것이 아니라, 명확하게 정의된 기술적 보증 범위를 지칭합니다. 이 ‘안전성’의 정확한 의미와 그 범위를 이해하는 것은 러스트의 공학적 설계를 분석하는 데 필요합니다.


본 3.2절에서는 먼저 러스트가 보증하는 ‘안전성’의 핵심 정의를 규명하고(3.2.1), 이어서 unsafe 키워드로 대표되는 보증의 경계(3.2.2), panic이라는 실패 모델(3.2.3), 그리고 메모리 릭과 논리적 오류처럼 보증 범위에 포함되지 않는 문제들(3.2.4, 3.2.5)을 순차적으로 분석하여 그 한계를 명확히 합니다.


3.2.1 ‘안전성’의 정의: 정의되지 않은 동작(UB) 방지

러스트 담론에서 ‘안전성(safety)’은 핵심 개념으로 제시됩니다. 이 용어의 기술적 정의는 명확한 규정이 필요합니다. 러스트 언어 모델에서 ‘안전성’은 모든 종류의 버그(bug)가 없음을 의미하는 것이 아니라, ‘정의되지 않은 동작(Undefined Behavior, UB)’의 부재를 보증하는, 구체적이고 한정된 의미로 사용됩니다.


‘정의되지 않은 동작’은 C/C++과 같은 언어에서 프로그램이 언어 명세가 규정하지 않는 상태에 진입하여, 시스템 충돌, 데이터 오염, 보안 취약점 등을 유발할 수 있는 예측 불가능한 행위를 의미합니다.


러스트의 설계 목표 중 하나는 ‘Safe Rust’로 분류되는 코드 영역에서 이러한 UB가 발생하는 것을 컴파일 시점에 정적으로 방지하는 것입니다. 러스트의 컴파일러(특히 빌림 검사기)는 해제 후 사용(use-after-free), 널 포인터 역참조(null pointer dereferencing), 버퍼 오버플로(buffer overflow), 그리고 스레드 간의 데이터 경쟁(data race)과 같은 UB 유발 원인들을 차단합니다.


이 정의는 러스트의 공식 문서 ‘러스트노미콘(The Rustonomicon)’에 명시되어 있습니다. “코드가 ‘안전(Safe)’하다고 말하는 것은, 이 코드가 어떠한 정의되지 않은 동작(UB)도 일으키지 않을 것임을 약속하는 것입니다.”3


따라서 러스트의 ‘안전성 보증’은 ‘메모리 안전성’과 ‘스레드 안전성(데이터 경쟁 방지)’이라는 특정 영역에 집중됩니다. 이 기술적 정의는 ‘안전성’이라는 용어에 대한 일반적인 인식(예: 프로그램의 논리적 정확성, 런타임 오류 부재)과 범위 차이가 있으며, 이는 이후 절에서 분석할 한계(메모리 릭, 패닉 등)를 이해하는 기준점이 됩니다.