unsafe は必要になることもあります

Rust コンパイラは、自身がコンパイルしたコードに対してしか、そのルールを適用できません。

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

fn main() {
    let pid = unsafe { libc::getpid() };
    println!("{pid}");
}

「unsafe を 必要とする 操作もあります。

「Rust コンパイラは、外部関数が Rust の メモリ保証に従っていることを検証できません。したがって、外部関数の呼び出しには unsafe ブロックが必要です。」

任意:

「外部環境とのやり取りでは、しばしばメモリの共有が伴います。コンピューターが提供する インターフェースはメモリアドレス(ポインタ)です。」

「これは、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) を 埋めます。外部関数を呼び出すことに加えて、OS がそのメモリにどのようにアクセスするかを コンパイラが検証できないため、その境界を unsafe として明示しなければなりません。」