Debian 13 passe son horloge en 64 bits pour éviter le bug de l’an 2038
Le 28 juillet 2025 à 15h38
2 min
Logiciel
Logiciel
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.

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)
Abonnez-vous pour prendre part au débat
Déjà abonné ? Se connecter
Cet article est en accès libre, mais il est le fruit du travail d'une rédaction qui ne travaille que pour ses lecteurs, sur un média sans pub et sans tracker. Soutenez le journalisme tech de qualité en vous abonnant.
Accédez en illimité aux articles
Profitez d’un média expert et unique
Intégrez la communauté et prenez part aux débats
Partagez des articles premium à vos contacts
Abonnez-vousModifié le 28/07/2025 à 15h49
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) ?
Le 30/07/2025 à 02h20
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…
Le 30/07/2025 à 14h38
Le 30/07/2025 à 20h22
Le 28/07/2025 à 15h55
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
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.
Modifié le 28/07/2025 à 16h14
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é.
Le 28/07/2025 à 16h35
Le 28/07/2025 à 20h06
C'était y'a deux ans et ils se plaignaient que la version de TLS posait problème
Le 28/07/2025 à 16h38
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)
Le 28/07/2025 à 18h15
Le 30/07/2025 à 10h09
Le 29/07/2025 à 01h35
Le 29/07/2025 à 07h38
Le 29/07/2025 à 14h30
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.
Le 28/07/2025 à 16h27
Le 28/07/2025 à 16h44
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.
Modifié le 30/07/2025 à 03h31
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_test unsize_t, qui a la taille de ce que renvoie l'opérateursizeof, 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.
Le 30/07/2025 à 09h20
- 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 ?
Le 30/07/2025 à 19h23
Le standard (et non une norme, mes excuses) C11 indique que
time_tdoit être de taillesize_t, défini par un appel à l'opérateursizeof.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_tsur 64 bits lorsque compilées sur une architecture ARM 32 bits ? Disposerais-tu de liens ?Modifié le 31/07/2025 à 08h23
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).
Le 28/07/2025 à 16h34
Le 28/07/2025 à 16h47
Le 28/07/2025 à 17h23
Le 28/07/2025 à 22h45
Le 28/07/2025 à 16h42
Le 28/07/2025 à 17h24
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 :)
Le 28/07/2025 à 18h33
time_tsur 64 bits. Seuls les systèmes 32 bits sont concernés.Le 28/07/2025 à 19h23
Le 29/07/2025 à 06h36
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.
Le 28/07/2025 à 16h50
Le 28/07/2025 à 17h45
Le 28/07/2025 à 16h51
Le 28/07/2025 à 17h21
Le 28/07/2025 à 17h26
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é.
Le 28/07/2025 à 17h01
C'est encore un coup de gens inspirés par les Cobolistes qui veulent refaire le grand soir de 2K...
Le 29/07/2025 à 17h07
Le 30/07/2025 à 10h22
Le 31/07/2025 à 19h02
Le 02/08/2025 à 21h35
Le 28/07/2025 à 18h31
Le 28/07/2025 à 20h00
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.
Le 29/07/2025 à 08h15
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...
Le 29/07/2025 à 09h48
Le 29/07/2025 à 10h53
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...
Le 29/07/2025 à 13h06
Le 30/07/2025 à 00h34
Pensez à congeler dans une capsule temporelle quelques développeurs cpp au cas où ...
Le 30/07/2025 à 08h32
Le 30/07/2025 à 15h31
Ça fait combien de version de debian 292 milliards d'années ? debian 15, debian 16 ?
#jesors
Le 02/08/2025 à 17h02
Signaler un commentaire
Voulez-vous vraiment signaler ce commentaire ?