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"));
    }
}

results matching ""

    No results matching ""