ゲッターの例

// 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);