לדלג לתוכן

פתרון אבחון פלט וזיכרון

הקוד הבא הוא ספרייה מלאה שניתן לבדוק באמצעות rustc --test או בתוך פרויקט Cargo. הוא בונה קלטים בלי תלות במחולל אקראי חיצוני.

fn by_iterator(bytes: &[u8]) -> u64 {
    bytes.iter().map(|&x| u64::from(x)).fold(0, u64::wrapping_add)
}
fn by_index(bytes: &[u8]) -> u64 {
    let mut sum = 0u64;
    for i in 0..bytes.len() { sum = sum.wrapping_add(u64::from(bytes[i])); }
    sum
}
#[test]
fn implementations_agree() {
    for len in 0..300 {
        let data: Vec<u8> = (0..len).map(|i| (i * 31) as u8).collect();
        assert_eq!(by_iterator(&data), by_index(&data));
    }
}
#[test]
fn valid_slice() {
    let bytes = Box::new([10u8, 20, 30]);
    let valid: &[u8] = &*bytes;
    assert_eq!(valid[0], 10);
}

האסמבלי הזהה מראה שהשינוי במקור לא שינה את גוף הפונקציה בתצורת הבנייה שנבדקה. הוא אינו מודד עלויות קריאה, התנהגות מטמון או עומס אמיתי. חוסר התאמה ב־repr(C) מתאים לבדיקת פריסה משני צדי הגבול, בעוד שהחזרת הפניה ארוכה מדי יכולה להיתפס בבדיקת קומפילציה שלילית אם ה־API הבטוח באמת מייצג את ההשאלה.