Connexion Abonnez-vous

Debian 13 passe son horloge en 64 bits pour éviter le bug de l’an 2038

Le 28 juillet 2025 à 15h38

Ce bug de l’an 2038 est similaire à celui de l’an 2000 : à cause d’un codage de la date dans un espace trop petit, le compteur risque de revenir à zéro une fois la limite atteinte. Pour le 1er janvier 2000, le risque était ainsi de voir la date revenir à 00, soit 1900.

Le problème réside cette fois dans le « timestamp Unix ». Il compte les secondes écoulées depuis le 1er janvier 1970 à minuit, heure UTC. Pour stocker cette valeur, les systèmes Unix et Linux se servent d’une valeur de type « signed 32-bit integer », dont la valeur positive maximale est de « + 2 147 483 647 ».

Dans la situation qui nous occupe à présent, cette valeur sera atteinte le 19 janvier 2038 à 03:14:07 UTC très précisément. La seconde suivante, le dépassement entrainera un retour à la valeur négative minimale de l’entier 32 bits, soit « - 2 147 483 64 », ce qui correspond à 1901.

Une montre à gousset
Photo de Anirudh sur Unsplash

Face à un entier 32 bits limité, la solution est évidente : passer au 64 bits. Ce mouvement est en cours depuis un moment déjà, mais pas partout. Chez Debian, dont la distribution sert de socle à Ubuntu et donc à de très nombreux autres systèmes, ce changement sera officialisé dans la version 13, nommée Trixie.

Comme l’équipe l’indique, le travail n’a pas été de tout repos. Il ne suffit pas en effet de changer le codage de la valeur pour que tout s’enchaine : tous les paquets y faisant référence doivent être modifiés. Dans le cas présent, pas moins de 6 429 paquets ont été identifiés comme utilisant au moins une fois la variable.

Debian 13 et tous ces paquets repérés utiliseront donc le format time_t 64 bits, même sur les architectures 32 bits. Pour les systèmes existants, le time_t 32 bits sera laissé en place pour ne pas casser la compatibilité sur les anciennes architectures. Sur le matériel 64 bits (très largement majoritaire), la bascule sera automatique.

Ce changement dans le codage de la valeur intervient 12 ans et demi avant la manifestation du problème. Quant au 64 bits, il fait disparaitre « définitivement » le problème, puisque la limite ne sera atteinte que dans… 292 milliards d’années.

Le 28 juillet 2025 à 15h38

Commentaires (49)

votre avatar
Sacré boulot sachant qu'il n'y a pas de méthodes de transition dans la glibc.

Est ce qu'ils ont donné des métriques de ce que ça change niveau quantité de stockage ou besoins mémoire (si ça change quelque chose) ?
votre avatar
Mais… on parle de stocker une horloge sur 4 octets supplémentaires !

Le nombre de dépendances est fourni, donc tu peux t'amuser à estimer toi même un pire des cas hypothétique.
Par exemple, supposons que tu charges toutes les dépendances sur un système unique et que chaque dépendance stocke 10 fois simultanément ses propres copie de l'horloge : surcoût de 6 429 10 4 ~= 250 Kio

Exercice d'ergotage foncièrement peu intéressant vu de quoi on parle, mais puisque tu sollicitais de l'aide…
votre avatar
Je pensais à l'horodatage de fichiers, ce genre de choses. Mais ça n'a peut être aucune incidence
votre avatar
Ouais ben 250 kio, c'est plus de 5 fois la mémoire de mon Oric Atmos. C'est pas rien.
votre avatar
"Ce changement dans le codage de la valeur intervient 12 ans et demi avant la manifestation du problème."

Oulah, c'est chaud. En Suisse, ils avaient annoncé en 2014 l'arrêt de la bande FM pour les radios à fin 2024 au profit du DAB+, eh ben fallait voir la quantité de personnes qui tombaient des nues que ça s'arrête effectivement :bigssourire: "on a pas été prévenus !", "c'est scandaleux"

J'espère qu'il ne sera pas de même pour les utilisateurs du système au manchot et que les distributions vont prendre le temps de faire la mise à jour qui va bien comme Debian.
votre avatar
Debian 12 en LTS arrive en fin de vie en juin 2028.
Si des gens continuent à l'utiliser 10 ans plus tard en 2038, ils ne pourront pas dire qu'ils n'auront pas été prévenus. Et surtout ils s'exposent à d'autres problèmes.

C'est pas comme si le problème était massivement connu depuis plus de 20 ans. Au bout d'un moment la sélection naturelle fait son œuvre 🤷‍♂️

Edit : l'arrêt de la FM pose un autre problème, celui de l'obsolescence de matériel qui fonctionne encore très bien, sans enjeu de sécurité.
votre avatar
A.k.a. le syndrôme "jusqu'ici, tout va bien" pendant une chute :ouioui:
votre avatar
A.k.a. le syndrôme "jusqu'ici, tout va bien" pendant une chute
Anecdote perso : en retournant chez un client, j'ai pu voir toujours en prod des Windows 2003 installés y'a 15 ans.

C'était y'a deux ans et ils se plaignaient que la version de TLS posait problème :D
votre avatar
C'est un peu HS (désolé), mais pour la FM et l'obsolescence du matériel, effectivement on aurait pu prolonger.
MAIS, vu le bénef de passer à la DAB comme les ressources consommées en moins pour que ça fonctionne mieux, j'y suis plutôt favorable. C'est un peu comme dire que ce n'est pas nécessaire de faire de changer les fenêtres de ma maison car elles sont encore en très bon état, alors que ce sont des vraies gouffres énergétiques. (OK, la comparaison est un peu maladroite)
votre avatar
Sauf que le Dab nécessite un maillage d'antenne plus important, et que tu ne peux pas juste mal capter, c'est tout ou rien.
votre avatar
Faut au moins émettre les infos trafic et prévisions météo via FM en parallèle... mais ce n'est que mon avis.
votre avatar
On peut imaginer que le problème soit déjà visible en 2028, par exemple en essayant de valider un certificat valide 10 ans et dont l'expiration tombe après la date fatidique...
votre avatar
Tu parles de l'autorité de certification ? Parce que les certificats de 10 ans, c'est plus trop la norme. Pour la CA, oui c'est la durée de vie moyenne que j'ai observée.
votre avatar
Oui, par exemple, ou alors vu qu'on parle d'architectures plutôt utilisées en embarqués (i386 n'est pas concerné, donc c'est armel et armhf) de certificats et ou autorité de certification interne aux entreprises (VPN, etc.)

Il faut aussi noté que le travail a été fait pour Debian 13, mais il pourra potentiellement être utile pour Debian 14 si ces architectures sont gardés pour cette version.
votre avatar
Debian 13 et tous ces paquets repérés utiliseront donc le format time_t 64 bits, même sur les architectures 32 bits. Pour les systèmes existants, le time_t 32 bits sera laissé en place pour ne pas casser la compatibilité sur les anciennes architectures.
Je ne suis pas sûr de bien comprendre ce passage. Les archis 32 bits passent à un time_t de 64 bits, ou on laisse 32 bits par compatibilité ?
votre avatar
Si tu ne veux un comportement connu, il faut un timestamp en 64 bits.

Par contre, pour une compatibilité binaire, les librairies et appels en seulement 32 bits perdurent, par contre on ne sait pas comment ils vont se comporter les programmes en passant de l'an 2038 à 1901.
Par exemple : ceux qui ne faisaient que des chronomètres en mémoire repartiront du bon pied après un redémarrage. Ceux qui stockent et comparent des dates dans des fichiers pourraient ne plus bien marcher du tout.
votre avatar
Petit mot générique :
Il est tout à fait possible de calculer des valeurs supérieures à l'adressage de la machine : simplement, une variable dépassant la taille maximum de l'architecture signifie que cette variable ne tiendra jamais dans un seul registre, ce qui veut dire que le compilateur produira des séquences d'instructions plus complexes pour réaliser les calculs.
Concrètement, tu perdras quelques cycles de CPU à chaque opération sur une variable 64 bits dans un programme compilé en 32 bits. C'est fonctionnel, mais pas optimal. Et si les opérations sont nombreuses, intensives et ayant de l'importance, tu vas réduire ta capacité de traitement.

Ici, le système s'occupera d'incrémenter l'horloge et les accès se feront en lecture pour comparaison : chaque accès nécessitera un stockage de la variable dans 2 registres (ou via deux pointeurs mémoires dans 2 registres). Rien de bien dramatique, mais c'est effectivement inefficace.

Cependant, c'est la théorie : dans la pratique, la norme prévoir le type utilisé pour stocker un horodatage.

Concernant le typage de time_t, il n'est tout simplement pas défini directement, laissant indirectement son typage relatif à l'architecture utilisée : c'est tout l'intérêt de types intermédiaires.
Spécifiquement, la page de manuel du noyau GNU/Linux (source) renvoie vers les normes :
- POSIX.1-2008
- C11 7.27.1§3

Cette dernière norme indique que time_t est un size_t, qui a la taille de ce que renvoie l'opérateur sizeof, soit la taille maximum de l'adressage possible suivant l'architecture.
Il est intéressant de noter ici que la norme de 2011 prévoit l'utilisation de size_t, qui est normalement un entier non-signé, mais pour des raisons historiques (pouvoir stocker nativement des dates avant le 1970-01-01 ?), GNU/Linux (et Unix en général) l'utilise de manière signée.

Alors, comment la bibliothèque temporelle GNU C fait-elle pour générer une possibilité d'horodatage 64 bits sur une architecture 32 bits ?
time_t étant contraint par la norme à l'architecture, le choix a été fait d'exposer des structures et fonctions associées supplémentaires : un programme 32 bits souhaitant utiliser un temps 64 bits doit donc effectuer des appels à des variantes spécifiques des fonctions de la bibliothèque.
Cela signifie du code spécifique, qui ne résistera pas à l'épreuve du temps (ces fonctions spécifiques seront dépréciées, puis retirées, à l'avenir). Avec derrière, je le rappelle, un symbole ne tenant in fine pas dans un registre unique.
Cf. https://www.gnu.org/software/libc/manual/html_node/64_002dbit-time-symbol-handling.html

C'est précisément pour éviter ces appels spécifiques, application par application, ce qui appelle un catastrophe d'échelle industrielle, que Debian a choisi d'effectuer le travail d'intermédiaire reliant les appels standard aux API de temps vers la version 64 bits sur les architectures 32 bits, car "quelque chose" doit le faire : décision politique.
Ils ont donc choisi d'agir au niveau de la mise en paquet, avec le changement de valeur par défaut d'une directive de configuration déjà implémentée de manière rétrocompatible depuis deux ans.
Cf. https://wiki.debian.org/ReleaseGoals/64bit-time#Background

Une belle leçon de gestion d'un changement complexe par la multiplicité de ses dépendances : si seulement nous pouvions assister à cela plus fréquemment plutôt que de la brutalité d'amateurs dans les groupes de mainteneurs et surtout… les entreprises.

2000 était une vaste blague (essentiellement SGBD avec des champs obsolètement typés, et applications codées avec le fiac), mais 2038 s'annonce réellement douloureux pour une architecture entière.

Comme d'hab', la majorité attendra le dernier moment pour s'en inquiéter ou bouger si elle doit le faire, alors que j'ai des souvenirs de professeurs/chercheurs nous sensibilisant à ce problème dans les années 2010, et ils en parlaient certainement avant, mais j'étais alors trop jeune pour entendre leur discours.
Ceux qui découvrent le problème ne font qu'exprimer leurs propres manques, en premiers desquels le manque de curiosité et l'attentisme; ceux qui y ont pensé sont au courant depuis fort longtemps, et l'indiquent à qui s'intéresse à la question.
votre avatar
Bon, en lisant les liens, je crois que je commence à démêler l'écheveau (et répondre à ma question toute simple, qui était "quels systèmes 32 bits passent en temps 64 bits, finalement") ... soit:

- Les architectures existantes 64 bits ont toujours été en 64 bits, il n'y a aucun changement.
- L'architecture existante "i386" est en time_t 32 bits et le reste, car c'est du legacy.
- La nouvelle architecture "i686" a été envisagée comme intermédiaire, 32 bits comme "i386" mais time_t 64 bits. Ils n'ont pas jugé utile de la déployer car en pratique personne ne l'utilisera (c'est plus utile de passer en amd64).
- Les architectures ARM 32 bits sont en time_t 32 bits, et seront migrées vers time_t 64 bits car ces architectures ont encore de l'avenir dans l'embarqué.

La dernière question reste alors : si la norme impose que time_t a la même taille que size_t, comment peut-on dire que les architectures avec size_t 32 bits et time_t 64 bits respectent la norme ?
votre avatar
si la norme impose que time_t a la même taille que size_t, comment peut-on dire que les architectures avec size_t 32 bits et time_t 64 bits respectent la norme ?
La norme POSIX ne définit pas de taille et renvoie à l'implémentation… mais est illustrée avec du C !
Le standard (et non une norme, mes excuses) C11 indique que time_t doit être de taille size_t, défini par un appel à l'opérateur sizeof.

Une architecture ne définit rien de tout cela : c'est la capacité d'adressage liée aux composants utilisés.
La définition des tailles est le fruit des bibliothèques de langage, implémentant généralement une norme ou un standard (afin que tout le monde parle un même… langage). Ici, on parle du C, et j'ai mentionné le standard C11, sachant qu'il a évolué et qu'il y a depuis d'autres versions.
Je me suis arrêté à ceux cités dans la page de manuel du noyau GNU/Linux à l'heure actuelle : mon point de départ.

Tu peux donc tout à fait respecter la norme POSIX citée (qui ne dit pas grand chose, et parle beaucoup d'exemples, d'état de l'art) en violant le standard C11.
Peut-être d'autres versions du standard C disent-ils autre chose : je n'ai pas creusé.

Dis-tu que tu as connaissance de bibliothèques C stockant time_t sur 64 bits lorsque compilées sur une architecture ARM 32 bits ? Disposerais-tu de liens ?
votre avatar
La norme POSIX ne définit pas de taille et renvoie à l'implémentation… mais est illustrée avec du C ! Le standard (et non une norme, mes excuses) C11 indique que time_t doit être de taille size_t, défini par un appel à l'opérateur sizeof.
Tu as une source pour ça ?

Moi dans le standard je trouve :

« The range and precision of times representable in clock_t and time_t are implementation-defined. »

Et c’est cohérent. Il faut que je regarde comment ça se passe sur les archis arm32, mais il me semble bien que si j’active les bonnes options pour avoir le temps sur 64 bits, j’ai sizeof(time_t) == 8, tandis que sizeof(size_t) == 4. (size_t étant grosso merdo la taille d’un pointeur).
votre avatar
Ce changement dans le codage de la valeur intervient 12 ans et demi avant la manifestation du problème.
Euh, personne ne s'était pas rendu compte du problème avant 2013 ? :keskidit:
votre avatar
Je pense que si, quand je faisais de la programmation pour Atari ST à la fin des années 80/début 90 c'était déjà un problème connu, même si on savait que ça tomberait "dans longtemps" ^^
votre avatar
Je pense que t'as pas compris la phrase : elle dit que ce changement arrive 12.5 ans avant le problème (prévu pour 2038), pas que le problème n'était pas connu y'a 12.5 ans.
votre avatar
Anéfé j'ai mal lu.
votre avatar
C'est très étrange, là où je bossais avant les serveurs étaient sous Ubuntu server, et ça fait déjà au moins 10 ans qu'il n'y a plus de problème de ce type sur les serveurs 64 bits (ça m'avait valu un arrachage de cheveux à l'époque pour des calculs de dates : mon environnement de dev était sous Arch 64 bits, non concerné par ce problème, et la date "infinie" avait arbitrairement été fixée au 8888-12-12... lors du passage en prod sur un serveur avec un timestamp en 32 bits, la date "infinie" était devenue une date dans le passé pour cause de débordement, et tous les comptes des utilisateurs permanents se sont retrouvés bloqués x_x).
votre avatar
C'est assez pernicieux comme problème. Dans les logiciels, si tu utilises une librairie moderne, oui, c'est traité depuis un moment.
Au niveau des FS modernes, c'est traité aussi.
Mais parfois, au détour d'un programme, d'un script, d'une requête, on revoit un endroit où le timestamp est toujours en 32bits (genre dans les BDD).

Donc niveau OS, logiciel "haut niveau", tu as l'impression que tout va bien, mais quand tu creuses il peut rester un tout petit endroit où c'est toujours en 32 bits :)
votre avatar
La news n'est pas très claire, il faut remonter à l'annonce originale chez Debian : l'architecture amd64 utilise déjà un time_t sur 64 bits. Seuls les systèmes 32 bits sont concernés.
votre avatar
Du coup ça limite assez le problème je pense, mais pas trouvé les statistiques pour Debian sur https://wiki.debian.org/Statistiques
votre avatar
Ça ne concerne que les archis 32 bits, donc il ne reste plus que les arms qui sont répandus en 32 bits (les x86 sont dépréciés, notamment avec debian 13 il n’y a plus de support).

Par contre, effectivement, aujourd’hui on continue de déployer plein d’objets connectés ou autres sous arm32, avec des systèmes qui buggeront en 2038. Pas nécessairement sous debian, mais le support 64 bits implique surtout le noyau et la glibc.
votre avatar
Quant au 64 bits, il fait disparaitre « définitivement » le problème, puisque la limite ne sera atteinte que dans… 292 milliards d’années.
Il serait temps d'amorcer le changement.
votre avatar
Mais ils étaient si pessimistes que ça au XXIème siècle ? :fou:
votre avatar
Il n'y a que les Debian-like de concernées ou aussi Redhat par exemple ?
votre avatar
C'est très vaste, ça dépasse complètement les Linux et BSD. Ca a été utilisé dans l'embarqué aussi.
votre avatar
T'as question n'est pas précise : tu demandes pour le problème, ou pour sa résolution ?
Parce que le problème est présent dans tous les systèmes qui sont basé sur Unix/Linux et BSD, donc partout, Android, MacOS, les Freebox, etc.
Par contre, la résolution du problème, ici il ne s'agit que de Debian faisant une annonce, donc ça les concerne qu'eux. A voir sur chaque plateforme/OS si c'est réglé.
votre avatar
QUE PERSONNE NE S’INQUIÈTE !!!
C'est encore un coup de gens inspirés par les Cobolistes qui veulent refaire le grand soir de 2K...
votre avatar
Mais chut enfin, c'est mon gagne-pain de demain que j'avais prévu.
votre avatar
Vil chenapan !
votre avatar
Avoue sans honte que tu es Coboliste !
:eeek2::phibee::sm:
votre avatar
J'aimerai bien, je pourrai facturer une blinde pour construire une indépendance financière. J'ai plutôt un bon gros bullshit job pas trop mal payé mais sans aucune saveur m'enfermant lentement et sûrement dans un avenir de servilité.
votre avatar
J'ai essayé de créer cette situation avec les fonctions Date et getTime du JavaScript et ça a l'air de fonctionner normalement. Je suppose que Windows n'a pas ce problème débordement de l'heure Unix.
votre avatar
tous les OS 32 bits ont le problème donc si t'avais testé sur un windows 7 32bits tu aurais eu le problème, et comme indiqué dans d'autres com le problème est pernicieux et peux se trouver n'importe où au passage d'un équipement ou programme 32bits, une fois que tous les équipements, programmes et OS seront tous 64bits il n'y aura plus de soucis. Malheureusement il existe encore énormément de petit processeurs 32bits notamment sur de l'embarqué qui peuvent durer très longtemps et dans ce cas il faut y penser et faire attention à ce que la date ne fasse pas d'overflow en 2038 si le format unix est utilisé mais ce n'est pas forcément le cas. Example sur des systèmes que je conçois le temps système commence quand la carte est allumée je n'en ai rien à faire de la date actuelle alors que sur d'autre système j'utilise le format unix de la date et il faut en tenir compte.

De plus le max en 2038 est si l'on considère le format date en signé alors que en non signé le max va jusqu'à 2106 et on peut très bien coder la date et dire que l'an 0 c'est l'an 2000 et donc on code jusqu'à 2136 il y a plein de possibilité en fait
Anecdote : la date envoyée sur le nbiot (réseau récent prévu pour l'iot... mdr) est justement au format date unix signée et donc va overflow en 2038. Potentiellement tous les appareils utilisant la date gsm sont à risque, et dans le mien j'ai géré le cas en disant que si ça overflow alors je considère la date comme non signée ce qui permet d'aller jusqu'en 2106. Mais bon j'ici là je pense que la gsma aura mis à jour sa spec et le format date évoluera d'une certaine façon et il faudra mettre à jour les équipements via OTA ou autre moyen prévu. Et ceux qui n'ont pas de moyen de maj ou le sous traitant chinois/indien qui les fait aura coulée c'est de l'obsolescence programmée.
votre avatar
La connerie a en effet été de ne pas coder cela sur un u32...
Les RTC qu'on se fait en embarqué typiquement dans un bout de FPGA sont toutes faites ainsi. On à pas la prétention de penser que le matos ira jusqu'à 2106...
votre avatar
Utilisateur Linux sur mes machines personnelles, j'ai aussi programmé pour Windows professionnellement, et je viens de regarder la doc pour rafraîchir mes souvenir: L'API Win32 a plusieurs structures pour gérer le temps, mais quand on résume en un seul mot, c'est bien du 64b.
votre avatar
Je me rappelle d'une fonction Win32 qui renvoyait le nombre de ms depuis le démarrage de Windows, dans 32 bits. Ça cyclait en 49 jours environ.

Pour les mauvaises langues : notre application tournait sous des Windows 95 et il n'était pas rare que ces machines survivent plus que 49 jours sans rebooter, d'où la nécessité de vérifier que nos applications supportent correctement le retour à 0 de ce compteur, et surtout prier pour que les applications tierces hors de notre contrôle mais qui tournaient sur cette machine (dont un serveur Personal Oracle 7) le supportent aussi. Ah la nostalgie de ces vertes années...
votre avatar
Quant au 64 bits, il fait disparaitre « définitivement » le problème, puisque la limite ne sera atteinte que dans… 292 milliards d’années.
Sachant que l'univers aura disparu entre temps (16 milliards peut être).
votre avatar
292 milliards d'année ?

Pensez à congeler dans une capsule temporelle quelques développeurs cpp au cas où ...
votre avatar
Quand on voit qu'il y a bon nombre de Windows Server 2012 en entreprise (13 ans donc!), préparer ça "seulement" 13 ans avant, ça causera à coup sûr quelques problèmes. Peut-être moins le cas avec Debian que Windows ceci-dit.
votre avatar
"Quant au 64 bits, il fait disparaitre « définitivement » le problème, puisque la limite ne sera atteinte que dans… 292 milliards d’années."

Ça fait combien de version de debian 292 milliards d'années ? debian 15, debian 16 ?

#jesors
votre avatar
Un excellent exemple pour les entiers signés en première NSI (et le compteur kilométrique d'une voiture qui ferait marche arrière à partir de 0 km 😉)

Debian 13 passe son horloge en 64 bits pour éviter le bug de l’an 2038

Fermer