לדלג לתוכן

פתרון בדיקה ותיקון של רכיב קרנל

פתרון ראשון

נוסיף את הפונקציה הבאה לקובץ הבדיקות ונרשום אותה במערך המקרים. הבדיקה משאירה ראש שאינו אפס בזמן ההכנסה הבאה, ולכן מפרידה בין חישוב לפי הראש לבין חישוב שגוי לפי מספר האיברים בלבד.

static void interleave_test(struct kunit *test)
{
    struct ring r = {};
    int value;
    unsigned int i;
    for (i = 1; i <= 3; i++)
        KUNIT_ASSERT_EQ(test, push(&r, i), 0);
    for (i = 1; i <= 2; i++) {
        KUNIT_ASSERT_EQ(test, pop(&r, &value), 0);
        KUNIT_EXPECT_EQ(test, value, (int)i);
    }
    for (i = 4; i <= 6; i++)
        KUNIT_ASSERT_EQ(test, push(&r, i), 0);
    for (i = 3; i <= 6; i++) {
        KUNIT_ASSERT_EQ(test, pop(&r, &value), 0);
        KUNIT_EXPECT_EQ(test, value, (int)i);
    }
}

פתרון שני

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

פתרון שלישי

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

נריץ מחזורי כשל והצלחה, נבדוק שההצלחה הבאה מקבלת מצב חדש תקין ונשתמש במוני רכישה ושחרור במעבדה או בכלי דליפות מתאים. נפריד בין היעדר אזהרות לבין שוויון מספרי הרכישות והשחרורים, מפני שדליפה קטנה יכולה להצטבר בלי להפיל את הקרנל.