» נושאי לימוד
» נושאי לימוד
יום חמישי 2 במאי 2024
Assert - התגוננות בפני שגיאות זמן ריצה
דף ראשי  הגן על עצמך  Assert - התגוננות בפני שגיאות זמן ריצה גרסה להדפסה

Assert הוא מונח/פקודה המופיע בצורות שונות בשפות תכנות שונות.

הרעיון שעומד מאחוריו הוא כזה - במקומות שונים בתוכנית אנו מניחים כל מיני הנחות ושותלים קריאות Assert האמורות לעצור את ביצוע התוכנית אם ההנחה לא התממשה. 

אילו הנחות?

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

בואו ניקח את המקרה הראשון ונניח שהתוכניתן שקרא לשגרה שלנו העביר לה אובייקט לא מאותחל.

void ReadStudentID(CStudent& stud)                                        
// pay attention - a reference to class CStudent is passed.
     // It must be initialized outside the function
{
    cout << "Enter the student ID "  << endl;
    cin >> stud.ID;
    ....
}

מה נרצה שיקרה במקרה כזה בו האוביקט לא אותחל?

ובכן, כמובן שהכי טוב היה אם המהדר היה עוצר אותנו עם שגיאת קומפילציה אבל זה בלתי אפשרי - העברת אובייקט מבלי להקצות אותו קודם כל אינו שגיאת קומפילציה והמהדר לא יכול לדעת ששגינו. זוהי שגיאת ריצה מסוג דריכת זיכרון (Runtime Error - Access violation)

 

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

 

void ReadStudentID(CStudent& stud)                                        
{
    assert (&stud != null);
    cout << "Enter the student ID "  << endl;
    cin >> stud.ID;
    ....
}

 

בשורת ה-Assert אנו מניחים שהביטוי שבתוך הסוגריים הוא נכון וערכו true.

במקרה ושכחו לאתחל את stud לפני הקריאה לשגרה, שורת ה-assert תעצור את ריצת התוכנית ותודיע שההנחה נכשלה וכך נגלה מוקדם מאוד את הבאג לפני שהמשיכה קריאת הערכים אל תוך stud הלא מאותחל.

 

מתי לא נרצה ליזום תעופה?
     לא נרצה ליזום תעופה כשגמרנו לפתח ומסרנו את המערכת ל-production. אז ננסה למנוע מהמשתמש כמה שיותר תעופות.

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

 

 13-03-04 / 01:10  נוצר ע"י ישי קנובל בתאריך 
 שימוש במוני לולאות - הקודםהבא - סגירות קטעים ביצועיים 
תגובות הקוראים    תגובות  -  0
דרכונט
מהי מערכת הדרכונט?
אינך מחובר, להתחברות:
דוא"ל
ססמא
נושאי לימוד
חיפוש  |  לא פועל
משלנו  |  לא פועל
גולשים מקוונים: 2