ゲッターの例
// Copyright 2026 Google LLC // SPDX-License-Identifier: Apache-2.0 /// `arr` から `index` 番目の要素を返す unsafe fn get(arr: *const i32, index: usize) -> i32 { unsafe { *arr.add(index) } }
“安全性の事前条件とは、Rust の安全性保証を維持するために満たされなければならない コード上の条件です
“安全性の事前条件と Safe Rust のルールの間には、密接な対応関係があることに気づくでしょう。”
質問: “get の安全性の事前条件は何ですか?”
- ポインタ
arrは null ではなく、正しくアラインされており、i32の配列を指している indexは範囲内にある
安全性コメントを追加します:
// Copyright 2026 Google LLC
// SPDX-License-Identifier: Apache-2.0
/// `arr` から `index` 番目の要素を返す
///
/// # Safety
///
/// - `arr` は null ではなく、正しくアラインされており、有効な `i32` を指している
/// - `index` は配列の範囲内にある
unsafe fn get(arr: *const i32, index: usize) -> i32 {
// SAFETY: 呼び出し元が index が範囲内であることを保証する
unsafe { *arr.add(index) }
}
任意: さらに堅牢にするため、デバッグビルドではランタイムチェックを追加できます。
// Copyright 2026 Google LLC
// SPDX-License-Identifier: Apache-2.0
debug_assert!(!arr.is_null());
debug_assert_eq!(arr as usize % std::mem::align_of::<i32>(), 0);