Unsafe иногда необходим
Компилятор Rust может применять свои правила только к коду, который он скомпилировал.
// Copyright 2026 Google LLC
// SPDX-License-Identifier: Apache-2.0
fn main() {
let pid = unsafe { libc::getpid() };
println!("{pid}");
}
«Некоторые действия требуют unsafe».
«Компилятор Rust не может проверить, что внешние функции соблюдают гарантии Rust относительно памяти. Поэтому вызов внешних функций требует небезопасного блока».
Необязательно:
«Работа с внешним окружением часто подразумевает совместное использование памяти. Интерфейс, который предоставляют компьютеры, — это адрес памяти (указатель)».
«Вот пример, в котором мы просим ядро Linux записать данные в память, которую контролируем мы:»
// Copyright 2026 Google LLC
// SPDX-License-Identifier: Apache-2.0
fn main() {
let mut buf = [0u8; 8];
let ptr = buf.as_mut_ptr() as *mut libc::c_void;
let status = unsafe { libc::getrandom(ptr, buf.len(), 0) };
if status > 0 {
println!("{buf:?}");
}
}
«Этот вызов FFI обращается к операционной системе, чтобы заполнить наш буфер (buf). Помимо вызова внешней функции, границу нужно пометить как unsafe, потому что компилятор не может проверить, как ОС работает с этой памятью».