איך אפשר לוודא שאין באגים בתוכנה מבלי להריץ אותה?
מערכות רבות שאנו מפתחים נשענות על תוכנה מבוססת קוד. בפרט בתחום המדיקל, בתחום הרכב או בתחום הביטחוני למשל – מהנדסים מפתחים מערכות מורכבות מאוד, שמבוססות על אלפי שורות של קוד. המחיר של שגיאות בקוד של מערכות אלו יכול להיות משמעותי, ואף הרסני – ועלינו לבצע בדיקות מקיפות בקוד שלנו על מנת לכסות ולמצוא את כל […]
מערכות רבות שאנו מפתחים נשענות על תוכנה מבוססת קוד. בפרט בתחום המדיקל, בתחום הרכב או בתחום הביטחוני למשל – מהנדסים מפתחים מערכות מורכבות מאוד, שמבוססות על אלפי שורות של קוד. המחיר של שגיאות בקוד של מערכות אלו יכול להיות משמעותי, ואף הרסני – ועלינו לבצע בדיקות מקיפות בקוד שלנו על מנת לכסות ולמצוא את כל המקומות הפוטנציאלים בהם חבויים באגים אפשריים בקוד שלנו, בשלב מוקדם ככל הניתן, ובטח (ובטח) עוד לפני שאנחנו מטמיעים את התוכנה ומפעילים המערכת הפיזית בשטח.
ניתוח קוד סטטי זו פעולה לאימות קוד מקור (source code) אשר מנתחת אותו לבחינת האיכות, המהימנות והאבטחה שלו – מבלי להריץ את הקוד. באמצעות ביצוע ניתוח סטטי על הקוד, אפשר לזהות פגמים ופגיעויות באבטחה שעלולות לסכן את הבטיחות של התוכנה אותה אנו מפתחים בשלבים מאוד מוקדמים של הפיתוח.
ואם עוברת לכם כרגע בראש המחשבה… "אנחנו כבר מבצעים בדיקות על התוכנה שלנו…למה בעצם להוסיף גם ניתוח קוד סטטי לסט הבדיקות?"
זו שאלה מעולה, הרי רוב צוותי פיתוח התוכנה כבר מסתמכים על טכניקות של בדיקות דינמיות לזיהוי באגים ושגיאות זמן ריצה בתוכנה. הבעיה עם בדיקות דינמיות היא שבדיקות אלו מחייבות לכתוב ולבצע test cases רבים. הרבה פעמים המפתחים עוצרים במלאכת ביצוע הבדיקות כתלות בדד ליין שמרחף מעל, מה שיכול להפוך את הבדיקות הדינמיות ל-לא ממצות מספיק. ולכן לא ניתן לסמוך על בדיקות אלה בשורה התחתונה לבדן כדי לייצר תוכנה בטוחה ומאובטחת.
ניתוח סטטי של קוד משלים למעשה את הבדיקות הדינמיות שאנו מבצעים ומספק לנו מספר יתרונות:
- איתור מאות סוגים של שגיאות ובאגים שונים – בין אם מדובר על שגיאות שקשורות לפעולות שקורות במקביל (concurrency), דאטה מזוהם (tainted data), בעיות ב-data flow, בעיות אבטחה או בזיכרון (סטטי או דינאמי). הרבה מסוגי הבאגים שנוכל למצוא בשיטות אלה כמעט בלתי אפשריים לזיהוי בבדיקות דינמיות.
- עלויות נמוכות – ניתן להפוך בקלות את ניתוח הקוד הסטטי לאוטומטי, ובכך לא לקחת בחשבון את התקורה של כתיבת test cases רבים, או הרצת התוכנה.
- רישיון הקוד ועמידה בתקנים – אפשר לוודא שהקוד שלנו עומד בתקני קוד מחמירים (כמו למשל MISRA, JSF וגם תקני אבטחה כמו CWE, CERT ו-ISO/IEC 17961).
- הוכחת היעדר קיום שגיאות קריטיות בזמן הריצה (run-time errors) – באמצעות כלי ניתוח סטטי ניתן להוכיח שהתוכנה לא תכשל בגלל שגיאות run-time, עושים זאת על ידי שימוש בשיטות פורמליות שמיישמות תאוריות מדעיות שונות לצורך הוכחת הקוד.
MathWorks מספקת את משפחת כלי Polyspace – בעזרתם אלו ניתן למעשה לבצע את בחינת הקוד שלנו בכדי לוודא שלתוכנה שנכתבה לא כוללת בה שגיאות. מעבר לגילוי הבאגים, נוכל להשתמש במוצר זה על מנת לדבג ולתקן את הקוד , להוכיח מתמטית שהקוד בטוח וחסין, לקבל מטריקות לאיכות הקוד, ולא פחות חשוב מכל אלה: הכלי מאפשר לנו לרשיין את הקוד לתקני בטיחות מחמירים כמו DO178, FDA ו- IEC61508.
2 כלים עיקריים ממשפחת כלים זו הם:
- Polyspace Bug Finder – מאפשר לנו לבדוק אחר הפרות הקשורות בתקנים שונים בקוד מקור של ++C\C, למצוא מאות סוגים של באגים שונים, לזהות פרצות באבטחה ופגיעויות אפשריות, ולחשב מדדי איכות ומטריקות שונות להערכת איכות הקוד.
תוכלו לשמוע עוד על כלי זה בסרטון הקצר הבא:
- Polyspace Code Prover – משתמש בשיטות פורמליות להוכחת היעדרותן של שגיאות run-time בקוד מקור של ++C\C – מבלי הצורך להריץ את הקוד.
הכלי צובע את קטעי הקוד שלנו ויודע לסווג כל חלק בקוד בצורה הבאה:
כך שאפשר להבין בדיוק אילו מנות בקוד הינן בדוקות וטובות (אידאלית, נשאף שכמה שיותר מהקוד יהיה צבוע בירוק), אילו חלקים בקוד מהווים לdead-code (אפור), איפה מסתתרות שגיאות run-time ועוד.
תוכלו לשמוע עוד על כלי זה בסרטון הקצר הבא:
למידע נוסף :
- Polyspace – עמוד המוצר באתר MathWorks
- וובינר (24:16) – שימוש ב-Polyspace ו-Static Analysis להוכחת נכונות הקוד
- וובינר (31:47) – Comprehensive Static Analysis Using Polyspace Products
- E-book – 7 Ways to Make Embedded Software Safe and Secure
- מאמר – Using Polyspace to Uncover Dead Code
- מאמר – Using Polyspace to Address Cybersecurity
- מאמר – Using Polyspace to Avoid Run-time Errors