comnic's Dev&Life

[Rust] 13. 안전한 코드와 unsafe 키워드 본문

Rust

[Rust] 13. 안전한 코드와 unsafe 키워드

comnic 2023. 12. 9. 17:52
반응형

13. 안전한 코드와 unsafe 키워드

 

13. 1 unsafe 키워드

 Rust는 안전성을 강조하는 언어로써, 대부분의 코드는 안전한 규칙을 따르도록 설계되어 있습니다. 그러나 특정한 경우에는 안전성 규칙을 우회하고자 할 때 unsafe 키워드를 사용할 수 있습니다. unsafe 블록 내에서는 일반적인 Rust 안전성 규칙을 무시할 수 있습니다.

fn main() {
    let mut data = 42;

    unsafe {
        // unsafe 블록 내에서 안전성 규칙을 우회
        data = data + 1;
        println!("Unsafe result: {}", data);
    }

    // 여기서부터는 다시 안전한 코드
    data = data * 2;
    println!("Safe result: {}", data);
}
  • unsafe { ... }: unsafe 키워드를 사용하여 안전성을 우회할 코드 블록을 정의합니다.
  • data = data + 1;: unsafe 블록 내에서는 일반적인 Rust 규칙에 어긋나는 코드도 허용됩니다.
  • data = data * 2;: unsafe 블록을 벗어나면 다시 일반적인 안전한 Rust 코드로 돌아옵니다.

 

13. 2 안전하지 않은 작업의 수행

unsafe 키워드는 주로 다음과 같은 상황에서 사용됩니다.

  • Raw 포인터 사용: Rust의 안전한 래핑을 피하고 직접 메모리에 접근해야 할 때.
  • 안전하지 않은 트레이트 구현: 특정 트레이트의 안전한 구현이 불가능하거나 어려운 경우.
// Raw 포인터를 이용한 안전하지 않은 작업
fn unsafe_example() {
    let mut data = 42;

    // &mut 대신에 Raw 포인터 사용
    let raw_ptr: *mut i32 = &mut data as *mut i32;

    unsafe {
        // Raw 포인터를 이용하여 메모리에 직접 접근
        *raw_ptr += 1;
        println!("Unsafe result: {}", *raw_ptr);
    }

    // 여기서부터는 다시 안전한 코드
    data = data * 2;
    println!("Safe result: {}", data);
}
  • *mut i32: *mut은 가변성을 나타내는 Raw 포인터 타입으로, 해당 타입의 메모리에 직접 접근할 수 있습니다.
  • *raw_ptr += 1;: Raw 포인터를 이용하여 메모리에 직접 접근하고 수정하는 코드. 이는 일반적인 Rust의 안전 규칙에 어긋납니다.
  • data = data * 2;: unsafe 블록을 벗어나면 다시 안전한 Rust 코드로 돌아옵니다.

주의사항: unsafe 키워드를 사용할 때에는 주의가 필요합니다. 안전성 규칙을 우회하는 것은 버그를 발생시키거나 메모리 안정성을 해칠 수 있습니다. unsafe 블록 내에서도 가능한한 안전한 코드를 작성하고, 러스트의 안전성 규칙을 최대한 따르는 것이 중요합니다.

 

반응형
Comments