Français

Outils de développement · Convertisseur d'horodatage Unix

Problème de l'année 2038 : que se passe-t-il lorsque 32-bit time_t déborde

· Contexte

horodatages Validation unix-time débogage

Un compteur 32 bits signé atteignant sa limite supérieure à côté d'une chronologie continue
Illustration vectorielle originale de ToolAcre

Le 19 janvier 2038 à 03:14:07 UTC, un compteur de secondes signé 32 bits revient à 1901. Cet article explique l'arithmétique, où se cache encore le temps 32 bits, et comment reconnaître un système qui sera affecté.

Une date plus proche qu'il n'y paraît : les hypothèques, les certificats et les micrologiciels calculent déjà des dates postérieures au 2038

Une limite datée du 2038 affecte le code chaque fois qu'elle calcule une date limite d'expiration, de calendrier ou de conservation au-delà de ce point. La panne peut donc apparaître des années avant la date de l'horloge. Ce référentiel ne documente pas les produits hypothécaires, de certificats ou de micrologiciels, ces exemples ne sont donc pas présentés comme des cas observés.

La question pratique de l'audit est de savoir si une limite stocke les secondes Unix dans un entier 32 bits signé. Un navigateur moderne formatant avec succès une date future ne dit rien sur un champ plus étroit en aval. Tracez la sérialisation et la persistance, pas seulement l'interface utilisateur.

Recherchez des calculs de dates futures dans les tests aujourd'hui plutôt que d'attendre une horloge de production. Un dispositif de limitation fixe transforme une préoccupation de calendrier lointaine en une vérification immédiate et reproductible.

Les calculs de dates futures peuvent exposer des limites de 32 bits avant 2038, mais les industries nommées ne sont pas mises en évidence ici.

Le maximum d'un entier signé 32 bits est 2³¹−1, ou 2,147,483,647. Les tests établissent que plusieurs secondes après l'époque sont `2038-01-19T03:14:07.000Z`. Une seconde mathématique supplémentaire devrait être 03:14:08, et ToolAcre l'affiche car le nombre et la date JavaScript peuvent porter la valeur.

Le retour à une valeur négative nécessite une opération externe signée 32-bit ; `fromEpoch` n'en effectue pas. Le résultat 1901 de décembre, souvent cité, peut être dérivé d’un complément à deux, mais affirmer que chaque système affecté s’enroule plutôt que de le rejeter, de le saturer ou de le corrompre irait au-delà des preuves. Testez la limite réelle.

Si une conversion externe effectue une arithmétique en complément à deux, inspectez les bits stockés résultants et la valeur négative décodée. Ne déduisez pas le bouclage uniquement à partir d’une date historique inattendue.

L'instant supérieur exact est vérifié ; le comportement du bouclage dépend de l'opération sur les entiers externes

Schémas de recherche, définitions de protocole et dispositions binaires pour les champs signés 32 bits qui contiennent des secondes d'époque. Une colonne SQL nommée INTEGER ne constitue pas une preuve suffisante sur tous les moteurs et une plateforme intégrée n'est pas automatiquement affectée. Déterminez la largeur, la signature, l’unité et le code de conversion pour chaque chemin.

Inclut les fichiers et les enregistrements mis en cache dans l'audit. Un type en mémoire élargi peut toujours écrire un ancien format étroit, tandis qu'une base de données large peut recevoir une valeur client tronquée. Créez des appareils au maximum et un au-delà, puis inspectez les octets ou la valeur persistante plutôt que de simplement vérifier qu'une fonction a renvoyé du succès.

Localisez les champs d'époque 32 bits signés en inspectant les schémas et formats réels

Le correctif conceptuel est une représentation dont la plage inclut les dates requises, généralement un nombre signé plus large ou un type temporel approprié. Le récit de migration du noyau, de la libc et du format du classeur se trouve en dehors de ces fichiers sources. Chaque système a son propre travail de compatibilité et de déploiement.

Élargissez chaque frontière grâce à un changement de contrat coordonné. La mise à jour du stockage sans champ filaire ou d'une bibliothèque sans données existantes laisse un lien étroit. Ajoutez un contrôle de version si nécessaire et testez explicitement les anciens lecteurs. La définition de l’époque elle-même n’a pas besoin de changer ; le conteneur le fait.

La planification de la migration doit inclure un comportement de restauration et de versions mixtes. Un nouvel écrivain produisant des valeurs larges peut briser un ancien lecteur avant qu'une date persistante n'atteigne la limite du calendrier.

L'élargissement de la représentation est la solution principale ; les migrations de noyau et de format sont spécifiques au système

Convertissez 2,147,483,647 en secondes pour obtenir `2038-01-19T03:14:07.000Z` ; convertissez 2,147,483,648 pour obtenir `2038-01-19T03:14:08.000Z`. L'étape fluide d'une seconde prouve que le chemin ToolAcre n'a pas de falaise 32-bit à cette valeur.

Forcez maintenant les mêmes chiffres en millisecondes. Ils tombent en janvier 1970 car les valeurs deviennent environ vingt-cinq jours après zéro. Cette comparaison évite qu'une erreur d'unité soit étiquetée à tort comme un problème 2038. La largeur et l'échelle du champ sont des dimensions indépendantes.

Cette comparaison démontre également pourquoi un convertisseur est diagnostique plutôt que vulnérable : la sélection explicite de l'unité détermine l'échelle, tandis que la représentation plus large du navigateur comporte les deux valeurs.

Exemple concret : le convertisseur franchit la limite car la date JavaScript n'est pas signée 32-bit secondes

Le référentiel teste également 4,294,967,295 secondes comme `2106-02-07T06:28:15.000Z`, le nombre maximum de 32 bits non signés. Il ne teste pas un basculement hebdomadaire GPS ni ne spécifie une falaise signée de 64-bit milliseconde, donc les sujets nommés sont omis plutôt que généralisés.

L'analyse des limites doit suivre le type exact utilisé. Le passage de signé à non signé s'étend dans une direction mais supprime les dates négatives et crée toujours un bord supérieur. Une représentation signée plus large préserve généralement les deux sens, sous réserve de la plage de dates du consommateur.

Chaque falaise a besoin de sa propre dérivation en termes de largeur, de signature et d'unité. Le regroupement des rollovers non liés sous « 2038 » masque le champ binaire qui nécessite réellement une modification.

La limite non signée de 32 bits est testée ; d'autres falaises nommées se trouvent à l'extérieur des preuves du dépôt

Un convertisseur ne peut pas auditer le code source, les binaires, les schémas de base de données ou les appareils déployés. Il montre ce que signifie un numéro de candidat et fournit des supports concrets pour les tests. La recherche statique, l'inspection de type, les tests de sérialisation et la répétition de migration doivent établir si un produit est sûr.

Ne fermez pas un audit car le navigateur affiche correctement 2038. Cela vérifie uniquement ce chemin de navigateur. Suivez la valeur de bout en bout, en particulier via les liaisons de langage et les anciens formats où un rétrécissement implicite peut se produire.

Incluez les interfaces de dépendance et de fournisseur dans cette trace. La source de l'application peut utiliser un type large tandis qu'une bibliothèque native ou un protocole de périphérique réduit la même valeur de manière invisible.

À retenir : l'époque est correcte, la largeur entière est le problème - et comment le convertisseur d'horodatage Unix vous permet de vérifier n'importe quelle valeur limite en UTC et en heure locale

Le problème de l'année 2038 est une limite de largeur entière, et non un défaut dans l'arithmétique d'époque Unix. La conversion réussie de ToolAcre des deux côtés rend cette séparation visible. Le système externe échoue uniquement si l'une de ses représentations ne peut pas supporter le décompte suivant.

Utilisez 2,147,483,647 et 2,147,483,648 comme vecteurs de test adjacents, vérifiez la persistance exacte, ainsi que l'unité et la signature du document. Les preuves à chaque frontière ont plus de valeur qu’une liste générique de technologies soi-disant vulnérables.

Les vecteurs adjacents doivent traverser un véritable chemin de sérialisation, pas seulement un calcul en mémoire. C’est là qu’une application théoriquement élargie peut révéler une couture étroite restante.