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 スライスに利用可能な領域が十分でない場合、データ全体は コピーされません。」