Skip to content

Le bug de l'an 2038

Comment un ordinateur sait-il l'heure qu'il est ?

Ton ordinateur, ton téléphone, un serveur web ou une box internet ne stockent pas « le 12 octobre 2026 à 14 h 30 ». Ils stockent un seul nombre entier : le nombre de secondes écoulées depuis une date de référence, fixée une fois pour toutes au

1er janvier 1970 à 0 h 00 min 00 s (temps universel).

Ce nombre s'appelle le temps Unix. C'est le système d'exploitation qui tient ce compteur à jour et qui le fournit aux programmes qui demandent l'heure : tu verras dans le chapitre sur les systèmes d'exploitation ce qu'est ce logiciel et quels autres services il rend.

Date (temps universel) Temps Unix
1er janvier 1970, 0 h 00 min 00 s \(0\)
1er janvier 1971, 0 h 00 min 00 s \(31\,536\,000\)
9 septembre 2001, 1 h 46 min 40 s \(1\,000\,000\,000\)

Pendant des décennies, ce nombre a été rangé dans un entier signé sur 32 bits. Cette page te fait découvrir ce que cela implique, avec ce que tu sais déjà sur les entiers relatifs.

1. Pourquoi un entier signé ?

Question 1

  1. Que représente le temps Unix \(-86\,400\) ? (Une journée compte \(86\,400\) secondes.)
  2. Explique en une phrase pourquoi on a choisi un entier signé plutôt qu'un entier naturel.
Corrigé
  1. Un jour avant la date de référence : le 31 décembre 1969 à 0 h 00 min 00 s.
  2. Pour pouvoir représenter des dates antérieures à 1970 : elles ont un temps Unix négatif.

2. D'abord sur 4 bits

Imaginons une horloge (très) mal conçue, qui range son temps dans un entier signé sur 4 bits. Elle démarre à \(0000\) et ajoute \(1\) à chaque seconde.

Question 2

  1. Quelle est la plus grande valeur que cette horloge peut atteindre ? Donne son écriture sur 4 bits et sa valeur.
  2. Pose l'addition de cette écriture et de \(0001\), sur 4 bits. Quelle écriture obtiens-tu ?
  3. Quel entier relatif cette nouvelle écriture représente-t-elle sur 4 bits signés ?
  4. Une seconde plus tard que son maximum, l'horloge se croit-elle dans le futur ou dans le passé ?
Corrigé
  1. \(0111\), c'est-à-dire \(2^3 - 1 = 7\).
  2. \(0111 + 0001 = 1000\) : les retenues se propagent jusqu'au bit de signe.
  3. \(1000\) représente \(-2^3 = -8\), le plus petit entier sur 4 bits signés.
  4. Dans le passé : elle saute de \(7\) secondes après la référence à \(8\) secondes avant.

3. Puis sur 32 bits

Question 3

  1. Écris, sous forme d'une expression avec une puissance de 2, la plus grande valeur d'un entier signé sur 32 bits.
  2. Quelle est son écriture binaire sur 32 bits ? (Tu peux dire combien de 0 et combien de 1, et dans quel ordre.)
  3. Une année compte environ \(31\,536\,000\) secondes. Avec une calculatrice, estime combien d'années après 1970 ce maximum est atteint. En quelle année cela tombe-t-il ?
Corrigé
  1. \(2^{31} - 1\), soit \(2\,147\,483\,647\).
  2. Un \(0\) (le bit de signe) suivi de trente et un \(1\).
  3. \(2\,147\,483\,647 \div 31\,536\,000 \approx 68\), donc \(1970 + 68 = 2038\).

La date exacte est le 19 janvier 2038 à 3 h 14 min 07 s en temps universel (4 h 14 min 07 s à Paris).

Question 4

  1. Une seconde plus tard, le compteur ajoute \(1\). Quelle est la nouvelle écriture sur 32 bits ? Appuie-toi sur ce que tu as fait sur 4 bits.
  2. Écris, sous forme d'une expression avec une puissance de 2, l'entier relatif que représente cette écriture.
  3. Environ combien d'années avant 1970 cela correspond-il ? En quelle année l'ordinateur se croit-il alors ?
Corrigé
  1. Un \(1\) suivi de trente et un \(0\) : exactement comme \(0111 + 0001 = 1000\) sur 4 bits.
  2. \(-2^{31}\), soit \(-2\,147\,483\,648\).
  3. Environ 68 ans avant 1970, donc 1901. La date exacte est le 13 décembre 1901 à 20 h 45 min 52 s en temps universel.

C'est cela, le bug de l'an 2038

Le 19 janvier 2038, une seconde après 3 h 14 min 07 s, tout système qui range encore le temps sur 32 bits signés se retrouvera en décembre 1901. Un certificat de sécurité paraîtra non encore valide, une échéance déjà passée paraîtra encore à venir, un tri par date sera faux.

Ce n'est pas une erreur de calcul de la machine : l'addition est juste sur 32 bits. C'est la taille fixée à l'avance qui ne suffit plus.

4. Les solutions

Question 5

  1. Si l'on rangeait le temps Unix dans un entier naturel sur 32 bits, jusqu'à quelle valeur irait-on ? Donne l'expression.
  2. Qu'y gagnerait-on, et qu'y perdrait-on ?
  3. La solution retenue est de passer à un entier signé sur 64 bits. Donne l'expression de sa plus grande valeur, puis estime avec une calculatrice combien de milliards d'années cela représente.
Corrigé
  1. \(2^{32} - 1\).
  2. On repousserait le problème jusqu'en 2106 (7 février 2106), mais on perdrait toutes les dates avant 1970, qui n'auraient plus d'écriture.
  3. \(2^{63} - 1\). Avec une année d'environ \(31\,536\,000\) secondes, on obtient environ \(292\) milliards d'années, soit plus de vingt fois l'âge de l'Univers.

La plupart des systèmes d'exploitation actuels pour ordinateurs et téléphones sont déjà passés à 64 bits. Le risque restant concerne surtout les systèmes embarqués anciens (automates, appareils industriels, véhicules, routeurs) et les fichiers ou bases de données qui ont enregistré des dates sur 32 bits : changer le programme ne change pas les données déjà écrites.