Обёртки для 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:?}");
}
Этот слайд демонстрирует, насколько легко обёртки вызывают неопределённое поведение, если написаны неправильно. Мы увидим, как легко вызвать проблемы с типобезопасностью.
Объясните, что функции rand и srand предоставляются стандартной библиотекой C (libc).
Объясните, что эти функции экспортируются крейтом libc, но мы также можем написать для них FFI-обёртку вручную.
Покажите вызов функций из экспортированных.
Код компилируется, потому что libc по умолчанию подключается к программам на Rust.
Объясните, что Rust вам поверит, если вы используете неправильный тип (или типы).
Измените fn rand() -> std::ffi::c_int;, чтобы он возвращал char.
Избежать проблем с типобезопасностью — одна из причин использовать инструменты для генерации обёрток вместо написания их вручную.