カプセル化された Unsafe Rust
// Copyright 2026 Google LLC // SPDX-License-Identifier: Apache-2.0 pub fn copy(dest: &mut [u8], source: &[u8]) { let len = dest.len().min(source.len()); let mut i = 0; while i < len { // SAFETY: `i` は source.len() から得られたため、境界内でなければなりません let new = unsafe { source.get_unchecked(i) }; // SAFETY: `i` は dest.len() から得られたため、境界内でなければなりません let old = unsafe { dest.get_unchecked_mut(i) }; *old = *new; i += 1; } for (dest, src) in dest.iter_mut().zip(source) { *dest = *src; } } fn main() { let a = &[114, 117, 115, 116]; let b = &mut [82, 85, 83, 84]; println!("{}", String::from_utf8_lossy(b)); copy(b, a); println!("{}", String::from_utf8_lossy(b)); }
“ここでは、内部で使用される unsafe ブロックをカプセル化した安全な関数が あります。
“この実装ではイテレータを避けています。代わりに、実装者が メモリに手動でアクセスしています。”
“これは正しいでしょうか?” “何か問題はあるでしょうか?”
“その正しさを保証する責任を負うのは誰でしょうか? 関数の作者です。
“unsafe ブロックを含む Safe Rust 関数は、入力によってメモリ安全性の問題が 発生しえないなら、依然として健全です。