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.