עבור לינוקס 5.18 מתוכנן להעביר את הקוד לגרסה עדכנית יותר של C על מנת לפתור בעיות שונות. 

מה זה לינוקס ולמה זה מיועד?

במהלך התהליך של דיון מפתחים של ליבת לינוקס על וl נושא של קבוצה של תיקונים לתיקון פגיעויות של Spectre בקוד לעבוד עם רשימות מקושרות, זה התברר עבור מפתחים רבים זו הבעיה ניתן לפתור ביתר קלות אם היה מותר בקוד הליבה C que תואם לגרסה חדשה יותר של התקן. 

וזה שכרגע הקוד שנוסף ל-Linux Kernel חייב להתאים למפרט ANSI C (C89), אשר נוצר בשנת 1989.

זו הסיבה הבעיה הקשורה ל-Spectre בקוד היה בגלל שהמשיך להשתמש באיטרטור מוגדר בנפרד לאחר הלולאה.

למרות אופיו המהיר בדרך כלל, פרויקט הליבה מסתמך על מספר כלים ישנים יותר. בעוד שמבקרים אוהבים להתמקד בשימוש הנרחב של הקהילה בדוא"ל, אנכרוניזם משמעותי יותר הוא השימוש בגרסת 1989 של תקן שפת C עבור קוד ליבה, תקן שקודם לפני תחילת פרויקט הליבה לפני למעלה מ-30 שנה. נראה שהתרגול רב השנים עשוי להסתיים ברגע הליבה 5.18, הצפוי במאי השנה.

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

למרבה הצער, ישנם מספר מיקומים בקרנל שבהם הרשימה
איטרטור משמש אחרי הלולאה שנשברת בשינוי כזה. לְמַרְבֶּה הַמַזָל
יש את הסקריפט use_after_iter.cocci שניתן להשתמש בו כדי לזהות כאלה
מיקומי קוד. הייתי צריך להתאים קצת את התסריט מכיוון שהוא מפחית את ה-false
חיובי במקרה השימוש המקורי, אבל אלה רלוונטיים לתיקון זה.

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

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

לאחר מכן, במהלך אימות ראשוני, ההרכבה ל-GCC ו-Clang במצב החדש עברה ללא סטייה. אלא אם כן יתעוררו בעיות בלתי צפויות עקב בדיקות נרחבות יותר, סקריפטי בניית הליבה 5.18 ישנו את האפשרות '–std=gnu89' ל-'–std=gnu11 -Wno-shift-negative-value'.

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

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

ראוי להזכיר זאת נשקללה האפשרות להשתמש בתקן C17, אך במקרה זה יהיה צורך להגדיל את הגרסה המינימלית הנתמכת של GCC, מכיוון שהכללת תמיכה עבור C11 תואמת את הדרישות הנוכחיות עבור גרסת GCC (5.1).

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


השאירו את התגובה שלכם

כתובת הדוא"ל שלך לא תפורסם. שדות חובה מסומנים *

*

*

  1. אחראי על הנתונים: AB Internet Networks 2008 SL
  2. מטרת הנתונים: בקרת ספאם, ניהול תגובות.
  3. לגיטימציה: הסכמתך
  4. מסירת הנתונים: הנתונים לא יועברו לצדדים שלישיים אלא בהתחייבות חוקית.
  5. אחסון נתונים: מסד נתונים המתארח על ידי Occentus Networks (EU)
  6. זכויות: בכל עת תוכל להגביל, לשחזר ולמחוק את המידע שלך.