カプセル化された 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 関数は、入力によってメモリ安全性の問題が 発生しえないなら、依然として健全です。