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 つです。