ניתוח קוד סטטי

במדעי המחשב, **ניתוח קוד סטטי** (באנגלית: **Static program analysis**) הוא תהליך אוטומטי לבחינת התנהגות תוכנה ללא הרצתה, וזאת בניגוד לניתוח קוד דינמי, אשר מחייב את הרצת התוכנה לצורך בחינת התנהגותה.
ניתוח קוד סטטי מוצא ומעדכן את המנתח אודות שגיאות ודאיות ושגיאות אפשריות אשר עלולות להתרחש בזמן הרצת התוכנה.

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

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

### חסרונות
* מצריך גישה לקובצי קוד המקור.
* מכסה שגיאות באופן חלקי; רק בעלות תבנית שהוגדרה מראש.
* לא מוצא שגיאות הקשורות לזמן ריצה.
* False Positives (אזהרה אודות שגיאות אשר לא קיימות בפועל) עלולים להוות מטרד עבור המפתח ולעלות לו בזמן בדיקת נכונות האזהרה.
* False Negative  (אי מציאת שגיאות שברור שקיימות בפועל, ואמורות, להימצא על ידי הכלי שבשימוש בהתאם לאלגוריתמי החיפוש שבנויים לתוכו), דבר אשר יכול לגרום לביטחון מוטעה בתקינות הקוד שנבדק

## שיטות מימוש
קיימות מספר שיטות למימוש הניתוח הסטטי של הקוד:
* ניתוח Control Flow ו-Data Flow – איסוף מידע אודות מקבץ הערכים האפשריים של משתנים בעקבות סדר ריצת הקוד.
* ניתוח מבוסס התניה – הגדרת התניות לישויות קוד ופתרון מתמטי של ההתניות.
* מערכת טיפוסים – ווידוא (אי) קיום של התנהגות שגויה בהתאם לטיפוס המשתנה (למשל פעולת החילוק אשר איננה אפשרית בין שני משתני מערך).
* פרשנות מופשטת – אינטרפרטציית התוכנה מעל דומיין מופשט.
* אימות מודל - רק בהינתן מספר מצבים סופי.
* שימוש ב"הערות הסבר" (Annotations) - מאפשר למפתח להצהיר על ציפיותיו בנוגע לקלט, ומקל על כלי הניתוח הסטטי במהלך הניתוח. לדוגמה השימוש ב- @NotNull ו-@Nullable בדוגמת הקוד הבאה:

```c#
private void DoSomething(@Nullable string firstName, @NotNull string lastName)
{
   if (firstName.substring(0,1).equals(“a”))
   {
     PrintStartsWithA();
   }
}
```


## מדדי סיבוכיות
 200px|שמאל|ממוזער|גרף בקרת זרימה של פונקציה עם לולאה והתניה לצורך הדגמת מדד הסיבוכיות - מורכבות ציקלומטית
ניתוח סיבוכיות הוא פן חשוב בתהליך ניתוח קוד סטטי, וזאת לצורכי הבטחת איכות תוכנה. מדדי הסיבוכיות בוחנים את מבנה התוכנה, אורכה, וממשקיה. בין קבוצות המדדים המוכרות כיום בעולם התוכנה, ניתן למצוא את מדדי McCabe ומדדי Halstead. מדדי הסיבוכיות מתחלקים לשתי קטגוריות:
* מדדי ארכיטקטורה - מבוססים על עיצוב התוכנה, ובוחנים מודולריות של קוד, שימוש במבני נתונים וכדומה.
* מדדים טקסטואליים - נמדדים על מרכיבי קוד יחידניים, ובוחנים מאפיינים ופונקציות בקוד.

כמו כן, יש להבחין בין מדדים לתוכניות שעוצבו בתכנות מונחה-עצמים) לעומת מדדים לתוכניות פרוצדורליות (procedural programming). מדדים לתוכניות שעוצבו באובייקטים בוחנים מאפייני תוכנית כמו כימוס (Encapsulation), פולימורפיזם (Polymorphism), ירושה (Inheritance), אבסטרקציה (Abstraction) ועוד.

להלן מדדי סיבוכיות לדוגמה:
# מורכבות ציקלומטית (Cyclomatic Complexity) - מודד את כמות הלוגיקה שבמתודה, פונקציה או רכיב תוכנה אחר. על ידי מניית מספר הנתיבים הליניאריים בקוד המקור של התוכנית. המורכבות הציקלומטית מחושבת בעזרת בקרת הזרימה (ה-Control flow) של התוכנית. ערך גבוה מעיד על מורכבות גבוהה אשר מהווה סיכון בהבנה ובבדיקות התוכנה.
# מספר שורות קוד (LOC) - אינדיקציה לאורך התוכנית מבוססת על מספר שורות קוד המקור המרכיבות את התוכנית.
# מספר מתודות למחלקה (WMC) - מניית מספר המתודות שמומשו במחלקה. מדד זה מאפשר לחזות את המאמץ שיידרש במקרה של שינוי המחלקה.

 מרכז|ממוזער|גרף המציג את מדד הסיבוכיות - מספר שורות קוד

## כלי ניתוח סטטי
ממוזער|250px|שמאל|דוגמה לפונקציונליות של SolidSX: כל הפונקציות והמתודות מסומנות במלבנים לבנים תחומים במסגרת שחורה. ניתן להבחין בלכידות גבוהה כתוצאה מהתלויות הפנימיות של פונקציות בתוך אותה מחלקה.
קיימים בשוק כלים רבים המאפשרים הרצה אוטומטית של ניתוח סטטי על קטעי קוד נרחבים בשפות השונות והמגוונות.
דוגמה לכלי הוא FindBugs שפותח באוניברסיטת מרילנד לצורך ביצוע ניתוח קוד סטטי בתוכנות מבוססות ג'אווה.
בנוסף ליכולות הניתוח הסטטי שצוינו לעיל, ניתן למצוא כלים המעניקים גם אפשרויות ויזואליזציה של מדדי איכות שונים של הקוד. דוגמה לכלי ויזואליזציה הוא SolidSX. כלים נוספים הם תוכנות דוגמת LDRA Testbed, SonarQube וקלוקוורק.

## ראו גם
* סקר קוד
* כיסוי קוד

## קישורים חיצוניים
* http://www.mccabe.com/iq_research_metrics.htm

## הערות שוליים

קטגוריה:כלי תכנות
קטגוריה:בדיקות תוכנה