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

Обёртки для srand(3) и rand(3)

// Copyright 2026 Google LLC
// SPDX-License-Identifier: Apache-2.0

use libc::{rand, srand};

// unsafe extern "C" {
//     /// Задаёт начальное значение генератора
//     fn srand(seed: std::ffi::c_uint);

//     fn rand() -> std::ffi::c_int;
// }

fn main() {
    unsafe { srand(12345) };

    let a = unsafe { rand() as i32 };
    println!("{a:?}");
}
This slide should take about 15 minutes.

Этот слайд демонстрирует, насколько легко обёртки вызывают неопределённое поведение, если написаны неправильно. Мы увидим, как легко вызвать проблемы с типобезопасностью.

Объясните, что функции rand и srand предоставляются стандартной библиотекой C (libc).

Объясните, что эти функции экспортируются крейтом libc, но мы также можем написать для них FFI-обёртку вручную.

Покажите вызов функций из экспортированных.

Код компилируется, потому что libc по умолчанию подключается к программам на Rust.

Объясните, что Rust вам поверит, если вы используете неправильный тип (или типы).

Измените fn rand() -> std::ffi::c_int;, чтобы он возвращал char.

Избежать проблем с типобезопасностью — одна из причин использовать инструменты для генерации обёрток вместо написания их вручную.