unsafe powers
unsafe는 권한이 아니라 컴파일러가 못 보는 조건을 사람이 증명하는 표시다
unsafe 블록 안에서도 대여 검사와 타입 검사는 계속 작동한다. 다만 다섯 작업의 전제 조건은 프로그래머가 직접 증명한다.
증명 범위
포인터 유효성, 초기화 상태, 별칭 규칙, 스레드 안전성, 외부 ABI
계약을 코드 근처에 남긴다.
| 허용 작업 | 무엇을 하는가 | 사람이 증명할 조건 | 감싸는 기준 |
|---|---|---|---|
| raw pointer 역참조 | 주소의 값을 직접 읽거나 쓴다. | 유효한 주소, 정렬, aliasing 규칙 | 안전 함수는 잘못된 포인터를 만들지 못하게 한다. |
| unsafe 함수 호출 | 호출 전 조건이 있는 함수를 실행한다. | 문서의 safety 계약 충족 | 검사와 변환을 호출 직전에 모은다. |
| mutable static | 전역 변경 상태에 접근한다. | 데이터 경합 방지와 동기화 | 전역 접근 경로를 하나로 좁힌다. |
| unsafe trait 구현 | 컴파일러가 모르는 불변조건을 약속한다. | 모든 구현 경로의 불변식 유지 | 타입 생성자에서 깨진 상태를 차단한다. |
| union 필드 접근 | 같은 메모리를 다른 필드로 해석한다. | 현재 활성 필드와 초기화 상태 | 읽기 가능한 변형만 API로 노출한다. |
Invariant
길이, 정렬, 수명, 중복 접근 조건을 unsafe 근처에 적는다.
Small scope
unsafe 블록은 작게 유지하고 안전 API가 경계를 감싼다.
Miri
테스트와 Miri로 포인터·초기화·별칭 문제를 추가 점검한다.
Review
코드 리뷰는 기능보다 safety 계약이 실제로 지켜지는지 본다.