Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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, потому что компилятор не может проверить, как ОС работает с этой памятью».