לדלג לתוכן

3.2 - מצביעים גולמיים ומוצא המצביע - פתרון

פתרון טיעון מקומי לפעולה

הבדיקה מתבצעת לפני אריתמטיקת המצביע. לכן בכל מסלול שמגיע לקריאה האינדקס נמצא בתוך הפרוסה החיה.

fn read_at(values: &[u32], index: usize) -> Option<u32> {
    if index >= values.len() {
        return None;
    }
    // SAFETY: index is within the live shared slice; its u32 elements
    // are initialized and aligned, and read copies a Copy value.
    Some(unsafe { values.as_ptr().add(index).read() })
}

fn main() {
    for values in [&[][..], &[10u32, 20, 30][..]] {
        for index in [0, 2, 3, usize::MAX] {
            assert_eq!(read_at(values, index), values.get(index).copied());
        }
    }
}

החוזה של add חל בזמן חישוב המצביע, ולכן בדיקה מאוחרת אינה מתקנת פעולה שכבר הפרה אותו. במוצר רגיל אין סיבה להשתמש במימוש הגולמי הזה בלי צורך נוסף; get().copied() מבטא את אותה פעולה בצורה קצרה ואינו מטיל עלינו תחזוקה של טיעון unsafe.