Pewnie pamiętacie strach przed Y2K. Kiedy zegar wybił rok 2000, media z radością przepowiedziały globalny upadek. Jednak choć wiele starszych systemów było już nadwyrężonych, w tle większości współczesnego Internetu nadal odmierza czas. Nazywa się to problemem 2038. Jest to zakorzenione w sposobie, w jaki języki programowania C radzą sobie z czasem.
Większość ludzi błędnie uważa, że problem dotyczy lat dwucyfrowych, tak jak miało to miejsce w przypadku Y2K. W rzeczywistości nie jest to prawdą. Źródło problemu leży głębiej w kodzie. Mianowicie w sposobie, w jaki programy C przechowują dane dotyczące daty.
Ograniczenia architektury 32-bitowej
Taka jest rzeczywistość techniczna. Standardowa biblioteka czasu w C używa 4-bajtowej liczby całkowitej ze znakiem do śledzenia czasu. To jest 32 bity. Ten format definiuje „czas epoki” rozpoczynający się 1 stycznia 1970 o godzinie 00:00:00 UTC. Każda sekunda po tym punkcie jest zapisywana jako liczba pierwsza.
Na przykład znacznik czasu „919642718” reprezentuje 919 milionów sekund od początku epoki. Odpowiada to 21 lutego 1999 r. Jest to przydatne, ponieważ odjęcie jednego znacznika czasu od drugiego daje dokładną liczbę sekund między dwoma zdarzeniami. Biblioteki następnie konwertują te sekundy na minuty, godziny lub lata.
Ale istnieje sztywna granica.
Maksymalna wartość 32-bitowej liczby całkowitej ze znakiem wynosi 2 147 483 647. Gdy tylko licznik ten osiągnie zero sekund po 1 stycznia 1970 r., następuje przepełnienie (przejście przez zero).
To przepełnienie następuje 19 stycznia 2038 roku.
Po tej dacie liczba całkowita ulega przepełnieniu. Zamienia się w liczbę ujemną. W przypadku systemu korzystającego z tego formatu ta wartość ujemna jest nieprawidłową datą. Zasadniczo jest to usterka w matrycy każdego oprogramowania, które nie zostało zaktualizowane.
Dlaczego jest to łatwiejsze niż problem Y2K
Dobra wiadomość? Naprawienie tego problemu nie jest tak kłopotliwe, jak koszmary komputerów mainframe z końca lat 90-tych.
W przypadku Y2K wiele systemów nie ujednoliciło sposobu przechowywania dat. Niektórzy używali formatu MM-DD-RR. Inne – RR-MM-DD. Brak uniwersalnego formatu spowodował, że programiści musieli szukać kodu w każdej aplikacji i ręcznie zmieniać logikę daty.
Problem roku 2038 jest czystszy.
Standardowa biblioteka czasu obejmuje cały proces śledzenia czasu. Definiuje własne typy i funkcje. Dlatego dobrze napisane programy można po prostu ponownie skompilować. Inżynierowie muszą jedynie zastąpić bibliotekę wersją, która wykorzystuje większy rozmiar bajtów.
Na przykład przejście z 4-bajtowej liczby całkowitej na 8-bajtową znacznie rozszerza zakres. 8-bajtowa liczba całkowita ze znakiem może liczyć znacznie powyżej 2038 bez przepełnienia. To jest aktualizacja oprogramowania. Nie jest to wymiana sprzętu. Żadnego przepisywania kodu. To tylko wymiana biblioteki.
Windows i Mac: różne liczniki czasu, różne problemy
Nie wszystkie systemy korzystają z 32-bitowego formatu C. Różne systemy operacyjne mają swoje własne cechy.
Na przykład system Windows NT używa 64-bitowej liczby całkowitej. Śledzi czas w odstępach co 100 nanosekund. Ale odliczanie zaczyna się nie od 1970 r., ale od 1 stycznia 1601 r. To przesuwa datę przepełnienia znacznie dalej. Windows prawdopodobnie osiągnie swój limit około 2184 roku.
Apple poszło inną drogą. Według oficjalnej dokumentacji Apple, macOS ma pozostać poprawny aż do 29 940. To będzie za około 27 000 lat. Jeśli więc korzystasz z komputera Mac, nie musisz się martwić, że Twój kalendarz ulegnie uszkodzeniu w roku 2038.
Kto jeszcze jest zagrożony?
Głównym zagrożeniem są systemy oparte na systemie Unix. Ale nie są sami.
Systemy wbudowane są również podatne na ataki. Wiele urządzeń IoT, kontrolerów przemysłowych i starszych serwerów baz danych korzysta z tego samego 32-bitowego formatu czasu. Jeśli nie zostaną zaktualizowane, zaczną błędnie interpretować daty po 19 stycznia 2038 r.
Rozwiązania krótkoterminowe mogą obejmować łatanie oprogramowania w celu prawidłowego radzenia sobie z ujemnymi czasami. Ale to jest tylko środek tymczasowy. Trwałe rozwiązanie wymaga przejścia na 64-bitowy format czasu.
Pytanie nie brzmi, czy kod zostanie złamany. Pytanie brzmi, czy systemy, na których działa ten kod, zostaną zaktualizowane przed upływem czasu.
Duża część infrastruktury, na której polegamy, przechodzi już do 64-bitowego pomiaru czasu. Ale nie wszystko. Stare serwery. Przestarzały sprzęt przemysłowy. Trochę wbudowanej logiki. To są słabe ogniwa.
Kiedy nadejdzie 19 stycznia 2038 roku, zegar osiągnie swój kres. W przypadku niektórych systemów będzie to wydarzenie niezauważalne. Dla innych jest to trudny przystanek. Jeśli będziesz czekać do ostatniej chwili, nie będziesz miał zbyt wiele czasu na łatanie kodu.
























