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 ラッパーを手作業で書くこともできると説明します。
公開された関数を呼び出す例を示します。
Rust プログラムにはデフォルトで libc がリンクされるため、コードはコンパイルできます。
間違った型を使っても、Rust はそれを信じてしまうことを説明します。
fn rand() -> std::ffi::c_int; を char を返すように変更します。
型安全性の問題を避けることは、ラッパーを手作業で書くのではなく、 生成ツールを使う理由の 1 つです。