באג 2038

מתוך ויקיפדיה, האנציקלופדיה החופשית
קפיצה אל: ניווט, חיפוש
אנימציה הממחישה איך יחזור התאריך לשנת 1901 ב-19 בינואר 2038 בשעה 03:14:08 UTC

באג 2038 הוא באג-מחשבים דמוי "באג 2000", שעלול לגרום לתקלות בתוכנות המשתמשות בזמן יוניקס לחישוב הזמן. הבאג משפיע על תוכנות המחזיקות את הזמן במשתנה מסוג מספר באורך 32 סיביות עם סימן (Signed 32bit Integer) ומפרשות את ערך המשתנה כזמן שחלף מאז 1 בינואר 1970 בחצות[1].

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

הסבר טכני[עריכת קוד מקור | עריכה]

מרבית מערכות ההפעלה סופרות את הזמן כזמן שחלף מאז 1 בינואר 1970 בחצות ומְחשבות את הזמן ברגע נתון בהתאם. במערכות 32 ביט, הזמן שחלף מוכנס בדרך כלל לתוך משתנה מסוג מספר באורך 32 סיביות עם סימן (Signed 32bit Integer). המספר המרבי שניתן לייצג בשיטה זאת הוא 2,147,483,647, ומשכך, צפויה בעיה לאחר שיעבור מספר שניות זה מאז ראשית הספירה של המשתנה, תופעה שתקרה ביום שלישי, ה־19 בינואר 2038 בשעה 03:14:07 UTC. לאחר מכן, על פי שיטת המשלים ל-2 (ייצוג מספרים עם סימן) ערך המשתנה יהיה 2,147,483,648- (המקביל ל־13 בדצמבר 1901), תופעה המכונה גלישה נומרית.

המועד ייצוג המספר בזיכרון (בבסיס 2) ייצוג המספר בזיכרון (בבסיס 10)
לפני 11111111 11111111 11111111 01111111 2,147,483,647
אחרי 00000000 00000000 00000000 10000000 2,147,483,648-

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

הבאג אינו קיים רק במערכות הפעלה, אלא בכל תוכנה המשתמשת במשתנה בן 32 סיביות לשמירת הזמן באופן מובנה בה. בין הדוגמאות לכך נמצאים מערכות קבצים השומרות את הזמן במשתנה בן 32 סיביות, פורמטים של קבצים בינאריים למערכות 32 סיביות, בסיסי נתונים עם משתני זמן בני 32 סיביות ושפות שאילתא דוגמת SQL עם פקודות דוגמת ()UNIX_TIMESTAMP.

פתרונות[עריכת קוד מקור | עריכה]

אין פתרון קל או מיידי עבור מערכות קיימות. שינוי הגדרת משתנה הזמן במערכות אלה למשתנה באורך 64 ביט יגרום לבעיית תאימות לאחור בכל האובייקטים המשתמשים בזמן במערכות אלה. שינוי המשתנה למשתנה ללא סימן (Unsigned, כלומר משתנה המכיל מספרים שלמים חיוביים בלבד) ידחה את הבעיה לשנת 2106 אך יגרום לבעיות תאימות לאחור במערכות שחישוביהן מערבים תאריכי עבר שנשמרו כמשתנה מסומן ולא הותאמו נקודתית לשינוי זה.

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

בין מערכות ההפעלה שטיפלו בבעיה נמצאת NetBSD שבגרסה 6.0 שלה שיצאה באוקטובר 2012 עברה למשתנה זמן בן 64 סיביות עם שכבת תאימות ליישומים המותאמים למשתנה זמן ישן[2]. OpenBSD עברה למשתנה זמן בן 64 סיביות בגרסה 5.5 שיצאה במאי 2014, אך ללא שכבת תאימות ליישומים ישנים, אשר עשויים לסבול מבעיות כאשר ייגשו למשתנה הזמן[3]. לינוקס משתמשת במשתנה זמן בן 64 סיביות עבור ארכיטקטורת מחשב של 64 סיביות בלבד; עבור מעבדים בארכיטקטורה של 32 סיביות לא נערך שינוי בשל רצון לתאימות לאחור[4]. נכון לשנת 2017 ממשיכה העבודה במעבר למשתנה 64 סיביות גם בארכיטקטורות 32 סיביות[5].

מערכת הקבצים NFS תומכת, החל מגרסה 4 שיצאה בדצמבר 2000, במשתנה זמן בן 64 סיביות לצד משתנה בן 32 סיביות[6].

ראו גם[עריכת קוד מקור | עריכה]

קישורים חיצוניים[עריכת קוד מקור | עריכה]

הערות שוליים[עריכת קוד מקור | עריכה]