באג 2038

אנימציה הממחישה איך יחזור התאריך לשנת [[1901 ב-19 בינואר 2038 בשעה 03:14:08 UTC]]
באג 2038 (באנגלית: Y2038 או Y2K38) הוא באג-מחשבים דמוי "באג 2000", שעלול לגרום לתקלות בתוכנות המשתמשות בזמן יוניקס לחישוב הזמן.

הבאג משפיע על תוכנות המחזיקות את הזמן במשתנה מסוג מספר באורך 32 סיביות בשיטת המשלים ל-2 (Signed 32bit Integer) ומפרשות את ערך המשתנה כזמן שחלף מאז 1 בינואר 1970 בחצות.

מרבית מערכות היוניקס המותאמות למחשבי 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), תופעה המכונה גלישה נומרית. התופעה עלולה לגרום לא רק לשגיאה בחישובי זמנים אלא גם לקריסת התוכנה. האמור יכול להתרחש לאו דווקא ביום שלישי, 19 בינואר 2038, אלא בכל חישוב של זמן עתידי שיכלול תאריך זה או מאוחר ממנו.

{| class="wikitable" border="1"
! המועד
! ייצוג המספר בזיכרון (בבסיס 2)
! ייצוג המספר בזיכרון (בבסיס 10)
|-
| לפני
| <code>11111111 11111111 11111111 01111111</code>
| 2,147,483,647
|- bgcolor="#EFEFEF"
| אחרי
| <code>00000000 00000000 00000000 10000000</code>
| 2,147,483,648-
|}

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

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

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

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

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

== ראו גם ==
* חותם זמן
* זמן יוניקס
* באגים הקשורים לשעה ותאריך

==קישורים חיצוניים==
* Chris Baraniuk, "[http://www.bbc.com/future/story/20150505-the-numbers-that-lead-to-disaster The number glitch that can lead to catastrophe]", BBC, 5 May 2015.

==הערות שוליים==
<div class="mw-content-ltr">

</div>
2038
קטגוריה:ייצוג זמן
2038