Problem roku 2038

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacji, wyszukiwania
Krótka animacja ułatwiająca wyjaśnienie problemu.

Problem roku 2038 (Y38, analogicznie do Y2K) – wada oprogramowania, która może się ujawnić 19 stycznia 2038.

Źródło problemu leży w sposobie zliczania czasu przez niektóre wersje systemu operacyjnego Unix oraz przez oprogramowania korzystające z tzw. Uniksowego timestampu (który bywa także wykorzystywany w systemach operacyjnych i oprogramowaniu nie mającym korzeni w systemie Unix). W podatnym na problem oprogramowaniu do przechowywania informacji o punktach w czasie służy 32-bitowa zmienna typu całkowitego ze znakiem (ang. signed integer) zawierająca liczbę sekund, które upłynęły od rozpoczęcia tzw. ery uniksa, czyli od 1 stycznia 1970, godz. 0:00 UTC. Maksymalna wartość wspomnianej zmiennej wynosi 2 147 483 647, co odpowiada godzinie 03:14:07 UTC, 19 stycznia 2038. W następnej sekundzie stan licznika sekund stanie się ujemny – nastąpi przeskok do najmniejszej wartości ujemnej (-2 147 483 648). Wyświetli się wtedy data 13 grudnia 1901 godz. 20:45:52. Może to spowodować poważne błędy w obliczaniu upływu czasu.

Problem 2038 wydaje się o wiele groźniejszy od pluskwy milenijnej z 2000, a także trudniejszy do uniknięcia. Zapobiec mu może przejście na 64-bitową reprezentację czasu (typ time_t), dla której analogiczny problem pojawi się dopiero w roku 292 277 026 596, czyli za około 292 miliardy lat – dla porównania wiek Ziemi szacuje się na 4,5 miliarda lat. Zmiana taka jest już powoli dokonywana[1] i należy się spodziewać, że zostanie zakończona przed rokiem 2038. 64-bitowa reprezentacja czasu zakończy się po upłynięciu 92233720368547 sekund od rozpoczęcia epoki Unix.

Największym problemem wydaje się nie tyle zmiana samych systemów uniksowych, lecz zmiany potrzebne w oprogramowaniu, które z różnych względów polegało na 32-bitowym rozmiarze zmiennej zawierającej czas. Oprogramowanie takie spotykane jest na przykład w systemach bankowych i ubezpieczeniowych[2].

Przypisy

Zobacz też[edytuj | edytuj kod]