Safe Rust

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

pub fn copy(dest: &mut [u8], source: &[u8]) {
    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));
}

「この実装では Safe Rust しか使用していません。

ここから何が分かるでしょうか?

copy は、Safe Rust で実装されている限り、メモリ安全性の問題を引き起こす ことは不可能です。これは、考え得るすべての入力引数に対して成り立ちます。」

「たとえば、Rust のイテレータを使うことで、ヌルポインタチェックや境界チェック が必要になるといった、ポインタを直接扱うことに関わるエラーを決して 引き起こさないようにできます。」

質問: 「ほかに何か思いつきますか?」

  • エイリアシングの問題はない
  • ダングリングポインタは起こり得ない
  • アラインメントは正しい
  • 初期化されていないメモリを誤って読み取ることはできない

「Rust が安全性の前提条件がすべて満たされることを保証しているため、copy 関数は 健全 だと言えます。」

「プログラマの観点からは、この関数は Safe Rust で実装されているため、 安全性の前提条件はないものと考えられます。」

「ただし、これは copy が常に呼び出し側の望むことを行うという意味では ありません。dest スライスに利用可能な領域が十分でない場合、データ全体は コピーされません。」