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 として明示しなければなりません。」