Rust는 기본적으로 안전한 프로그래밍을 위한 다양한 기능을 제공합니다.
하지만, 때로는 안전성을 포기하고, 저수준의 시스템 작업을 수행해야 하는 경우가 있습니다.
이 때 unsafe
키워드를 사용합니다.
unsafe
는 Rust 컴파일러가 안전성을 보장할 수 없는 코드를 표시하는 키워드입니다.
이를 사용하면 Rust의 안전성 검사를 우회하고, 저수준의 시스템 작업을 수행할 수 있습니다.
주로 외부 함수, 원시 포인터, 정적 변수에 접근하는 등의 작업에 사용됩니다.
unsafe
키워드를 사용하여 함수와 메서드를 정의할 수 있습니다.
이를 사용하면 안전하지 않은 작업을 수행할 수 있습니다.
호출하는 쪽에서도 unsafe
블록 내에서 호출해야 합니다.
unsafe fn dangerous_function() {
// 안전하지 않은 작업 수행
}
fn main() {
unsafe {
dangerous_function();
}
}
원시 포인터는 메모리 주소를 직접 가리키는 포인터로, Rust의 안전성을 보장하지 않습니다.
*const T
와 *mut T
형식으로 사용할 수 있습니다.
원시 포인터는 unsafe
블록 내에서 사용해야 합니다.
fn main() {
let mut num = 5;
let r1 = &num as *const i32;
let r2 = &mut num as *mut i32;
unsafe {
println!("r1 가리키는 값: {}", *r1);
println!("r2 가리키는 값: {}", *r2);
}
}
외부 함수는 다른 프로그래밍 언어로 작성된 함수를 Rust에서 호출할 수 있도록 해주는 인터페이스입니다.
외부 함수를 사용하려면 extern
키워드와 unsafe
를 사용해야 합니다.
// C 언어의 함수를 호출하는 예시
extern "C" {
fn abs(input: i32) -> i32;
}
fn main() {
let x = -3;
let result = unsafe { abs(x) };
println!("{}의 절댓값은 {}입니다.", x, result);
}
이렇게 unsafe
를 사용하여 Rust의 안전성 검사를 우회할 수 있습니다.
하지만 가능한 한 unsafe
를 사용하지 않고, 안전한 코드를 작성하는 것이 좋습니다.
정말 필요한 경우에만 사용하고, 주의해서 사용해야 합니다.