20 Unsafe operations
이번 섹션에서 소개하고 싶은 내용은, 공식 문서에서 빌려왔다, "unsafe 코드의 양을 최소화 하기 위해 노력해야 합니다." 이를 염두하고 시작해보자! Rust에서 Unsafe 블록들은 컴파일러의 보호체계를 우회하여 삽입된다; 구체적으로, unsafe 블록을 사용해야 할 네 가지 주요한 점이 있다:
- 로우 포인터의 역참조
- FFI를 통한 함수 호출 (이는 다른 파트에서 다뤘다.)
std::cast::transmute
을 통해 타입 변경.- 인라인 어셈블리
Raw Pointers
로우 포인터 *
와 참조 &T
함수는 유사하지만, 참조는 항상 안전한데 왜냐면 이들은 대여검사자를 통해 검증된 데이터를 지정한다고 보장되기 때문이다. 로우 포인터의 역참조는 unsafe 블록을 통해서만 가능하다.
// pointer.rs
fn main() {
let raw_p: *const u32 = &10;
unsafe {
assert!(*raw_p == 10);
}
}
Transmute
한 타입을 다른 타입으로 간단히 변경하게 해주지만, 두 타입은 반드시 같은 사이즈와 정렬을 가져야 한다:
// transmute.rs
fn main() {
let u: &[u8] = &[49, 50, 51];
unsafe {
assert!(u == std::mem::transmute::<&str, &[u8]>("123"));
}
}