Le bug de l’an 2038

Publié le 15 avril 2016 par Gee dans Tu sais quoi ?
Inclus dans le livre Grise Bouille, Tome II

La dernière fois, je vous avais laissé sur une intervention absolument attendue de Cliff Hanger après un article sur le bug de l’an 2000… Comme vous l’attendiez tous avec impatience (je vous connais, ne niez pas), voici la suite (et la fin) de cette grande aventure au pays des dates buguées.

Par ailleurs, j’ai participé avec des camarades dessinateurs à un petit projet sympathique appelé Tac au Tux, n’hésitez pas à aller y jeter un œil 🙂

Le bug de l'an 2038

La dernière fois, nous avons parlé du fameux bug de l'an 2000 (alias Y2K ou « Why touquet ? » pour la blague, hoho qu'est-ce qu'on se gausse oulalah je n'en peux plus j'ai mal aux côtes). Passons au vif du sujet : le bug de l'an 2038.

Le smiley, surpris : « La vache, j'arrive plus à suivre avec les suites d'Hollywood. Y'a déjà eu 38 épisodes ?! »

(Enfin, si mon smiley me lâche un peu la grappe, je pourrais peut-être passer au vif du sujet.)

Le smiley, vexé : « Ça va, ça va… »

DONC.

Lors du passage à l'an 2000, les systèmes de type Unix n'ont pas eu trop de souci, et pour cause : les dates n'y sont pas stockées sur deux chiffres décimaux mais sur 32 bits (soit 4 octets*).

Le Geek regarde une date sur 32 bits d'un air pensif : « Du coup, là, comme ça, j'ai du mal à me rendre compte. » La date dit : « Demain, nous serons le 0010 0100 0001 0111 1101 1010 1011 1100 et nous fêterons les Vivien ! »

Si vous êtes largués, je vous renvoie à l'article « Bit, Byte, Bitten ».

Pour être précis, la date et l'heure sont communément stockées dans un nombre unique que l'on appelle « timestamp » et qui correspond au nombre de secondes écoulées depuis l'origine du temps.

Le Geek : « J'ai quand même du mal à me rendre compte… » Gee : « C'est pourtant simple : connaissant l'origine du temps et le nombre de secondes écoulées (c'est-à-dire le timestamp), tu peux facilement calculer l'année, le mois, le jour, l'heure, etc. »

Gee : « Enfin, facilement… y'a des formules horribles pour tenir compte des années bissextiles et des mois à longueur variable, c'est très long et très chiant.  Heureusement qu'un ordinateur est spécialisé pour calculer les trucs très longs et très chiant rapidement et sans erreur. » Gee montre un robot qui est tout fier de lui et dit : « Tatsooiiiiiin ! Visez un peu le come-back ! » Le smiley, taquin : « Tiens, rev'là Forrest Gump ! »

Petite précision : quand je dis « l'origine des temps », je ne parle bien sûr pas de l'an 0 de notre calendrier grégorien mais du 1er janvier 1970 à minuit précise.

Pourquoi cette date ?

Un très long dessin psychédélique, avec des cœurs partout, des notes de musique, des symbole « paix, et qui commence par un hippie en train de fumer un gros joint et qui dit : « Parce que c'était une putain de bonne année, mec. » On y voit également : le groupe Led Zeppelin chanter « Since I've Been Loving You» », David Bowie chanter « The Man Who Sold The World », une vache qui fait « meuuuuhh !!! » (référence à Atom Heart Mother de Pink Floyd, et enfin Gotlib qui demande au smiley : « Bonjour, vous ne seriez pas parent avec une coccinelle ? »

Bon, en fait c'est juste que ça s'est décidé au début des années 70 et qu'on a pris au plus proche.

(D'ailleurs ce fut un temps le 1er 1971 qui avait été choisi, allez savoir pourquoi.)

Le smiley en hippie qui fume un gros joint : « Je préférais l'autre explication… »

Bref.

La date est donc stockée dans un nombre entier, un « integer » de son petit nom en anglais.

Gee, devant un tableau indiquant des prononciations : « Integer qui se prononce “ine-té-DJEUR” et non “ine-té-GUEUR” comme on l'entend trop souvent*.  Tiens, c'est rigolo, c'est exactement comme pour mon pseudo.  Je rappelle que le prochain qui m'appelle “Gui” au lieu de “Dji”, j'lui pète la jeule.

#trueStory, si on pouvait prévenir les profs d'info de France qui enseignent la faute de prononciation à chaque génération d'élèves…

Il s'agit souvent d'un entier signé, c'est-à-dire que sur les 32 bits, il y en a un qu'on utilise pour savoir si le nombre est négatif ou positif.

La Geekette : « Si vous avez suivi, un timestamp négatif correspond donc à une date antérieure au 1er janvier 1970.  Ainsi, le débarquement de Normandie n'a pas eu lieu en 1944 mais bien en 26 avant LZ*.

Led Zeppelin. Ouais, ils ne sont pas nés le 1er janvier 1970 mais Jésus de Nazareth n'est pas non plus né le 25 décembre 0 alors de quoi j'me mêle, hein.

Ce dont il faut bien avoir conscience, c'est que si ce timestamp est stocké sur une taille fixe (31 bits + le bit de signe), c'est bien qu'il a une valeur maximum.

Gee, devant une date sur 32 bits : « La valeur maximum, c'est ça (0111 1111 1111 1111 1111 1111 1111 1111). Ce qui correspond à 2147483647 secondes. » Une flèche indique « bit de signe » sur le 0 au tout début. Une deuxième date indique 1000 0000 0000 0000 0000 0000 0000 0000. Gee dit à ce sujet : « Si on ajoute 1 à ce nombre binaire, on passe à ce nombre qui est le plus petit nombre négatif, soit -2147483648 secondes. » Le smiley, énervé : « Police du karma, arrêtez cet homme !  Il parle en maths ! »

Nous pouvons donc, à l'aide de ces valeurs, donner la date de la fin du monde dans l'univers Unix, exactement 2 147 483 647 secondes après le 1er janvier 1970 à minuit :

Le 19 janvier 2038 à 3h 14min 7s.

Le Geek, déçu : « Ah mince, ça fait court. J'aurai même pas atteint l'âge de la retraite.  Enfin j'veux dire, même sans compter les 15 réformes qui l'auront porté à 110 ans d'ici là, j'aurai quand même pas atteint l'âge de la retraite. » Le smiley, démoniaque : « Ça, c'est c'que tu récoltes pour avoir déconné avec nous… »

Ensuite, que va-t-il se passer ? Eh bien, plus ou moins la même chose qu'avec le bug de l'an 2000 : on va reboucler sur la plus ancienne date représentable.

Gee : « C'est-à-dire le 13 décembre 1901, 2147483648 secondes avant le 1er janvier 1970. » Un mec lambda : « Passer du 19 janvier 2038 au 13 décembre 1901 ?! Vous voulez dire qu'on va remonter le temps ?! Mais y'avait pas d'ordinateurs en 1901 !  Paradoxe… » Gee, blasé : « Oh non, pas encore lui… » Le smiley a la tête à l'envers.

Alors, comment faire pour régler ce problème qui va arriver relativement vite ?

Surtout si on travaille déjà avec des dates d'un futur assez lointain…

Gee, encore blasé, les bras croisés : « Genre pour un rendez-vous chez l'ophtalmo au fin fond de la campagne, j'aime autant vous dire qu'on risque l'integer overflow* assez vite… » Une secrétaire de cabinet médical : « Alors pour renouveller vos lentilles, j'aurai un créneau de libre en mars 2042… laissez-moi noter le rendez-vous dans mon calendrier**. » Le smiley, étonné : « Dites, pendant un instant, j'me suis perdu… »

Dépassement d'entier : ce qui arrive quand on essaie de compter au-delà du maximum représentable par un integer (exactement le bug de l'an 2038 donc).

Et là, il va se passer quoi ? Un ? Un ? Un bug. Suivez, un peu.

Plusieurs solutions : tout d'abord, bien sûr, passer à un format non-signé (le bit de signe est donc remplacé par un bit standard, ce qui porte la taille du nombre à 32 bits).

La Geekette, déprimée : « Dans ce cas, le bug arrivera en 2106.  On sera à peu près tous morts, mais on peut considérer que c'est salaud de laisser un cadeau comme ça à nos enfants…  Et en même temps, vu ce qu'on va leur laisser côté environnement, économie et politique mondiale, je pense que l'integer overflow sera le moindre de leurs soucis… »

Ou bien sûr, stocker les dates sur 64 bits au lieu de 32, ce qui est d'ailleurs déjà le cas sur les systèmes Unix 64 bits. Du coup la date butoir se situerait dans 292 milliards d'années. C'est-à-dire dans vachement longtemps.

Non mais sérieusement, quand je dis vachement longtemps, c'est…

Vachement.

Longtemps.

Une ligne du temps avec plusieurs événements représentés. Tassés tout au bout à gauche, plein d'événements très proches : « naissance de l'univers » ; « naissance du Soleil » ; « apparition de la vie sur Terre » ; « début du timestamp sur 64 bits (aujourd'hui ou le 1er janvier 1970, peu importe à cette échelle, hein…) » ; «probable mort du Soleil ». Et très très loin, tout au bout à droite, on a « fin du timestamp sur 64 bits

Le Soleil, taquin : « Point de vue angoisse métaphysique, j'ai l'impression d'être une merdouille sur cette frise, mais c'est gentil à vous d'être là pour m'aider à relativiser… » Gee, mal à l'aise : « Euuuuh… de rien ?  J'vais peut-être aller me r'coucher, moi… »

Pour conclure, on entendra sans doute quand même parler du bug de l'an 2038 dans les années à venir.

Parce que même si la plupart des systèmes seront à jour d'ici là, il ne faut jamais sous-estimer l'inertie en informatique…

L'IPv6 regarde l'IPv4 d'un air très énervé, et s'écrie : « MAIS TU VAS FINIR PAR FOUTRE LE CAMP, OUI ?! » Note : BD sous licence CC BY SA (grisebouille.net), dessinée le 14 avril 2016 par Gee.

Publié le 15 avril 2016 par Gee dans Tu sais quoi ?

🛈 Si vous avez aimé cet article, vous pouvez le retrouver dans le livre Grise Bouille, Tome II.

Soutenir

Ce blog est publié sous licence libre, il est librement copiable, partageable, modifiable et réutilisable. Il est gratuit car financé principalement par vos dons. Sans inscription, vous pouvez très simplement me soutenir :

Pour l'année 2023-2024, 7967 € ont pour l'instant été collectés sur un objectif annuel de 21 000 € (SMIC brut), soit 38 % de l'objectif :

Sources de revenu Avancement de l'année

Vous pouvez également, si vous le souhaitez, passer par une plateforme de financement participatif :