Strumenti per sviluppatori · Convertitore di timestamp Unix
Il problema dell'anno 2038: cosa succede quando 32-bit time_t va in overflow
· Sfondo
timestamp tempo Unix debug
Il 19 gennaio 2038 alle 03:14:07 UTC un contatore di secondi firmato da 32 bit va a finire in 1901. Questo post spiega l'aritmetica, dove si nasconde ancora il tempo a 32bit e come riconoscere un sistema che sarà interessato.
Una data più vicina di quanto sembri: mutui, certificati e firmware stanno già calcolando date passate 2038
Un limite datato 2038 influisce sul codice ogni volta che calcola una scadenza, una pianificazione o un termine di conservazione oltre tale punto. Il guasto può quindi manifestarsi anni prima rispetto alla data dell'orologio. Questo repository non documenta mutui, certificati o prodotti firmware, pertanto tali esempi non vengono presentati come casi osservati.
La domanda pratica di controllo è se qualche limite memorizza i secondi Unix in un intero con segno 32 bit. Un browser moderno che formatta con successo una data futura non dice nulla su un campo più ristretto a valle. Traccia la serializzazione e la persistenza, non solo l'interfaccia utente.
Cerca i calcoli delle date future nei test oggi invece di aspettare un orologio di produzione. Un confine fisso trasforma una preoccupazione di calendario distante in un controllo immediato e ripetibile.
I calcoli delle date future possono esporre limiti di 32 bit prima di 2038, ma i settori denominati non sono evidenziati qui
Il numero massimo di un intero con segno 32 bit è 2³¹−1 o 2,147,483,647. I test stabiliscono che molti secondi dopo l'epoca come `2038-01-19T03:14:07.000Z`. Un altro secondo matematico dovrebbe essere 03:14:08 e ToolAcre lo visualizza perché JavaScript Numero e Data possono contenere il valore.
Il ritorno a capo su un valore negativo richiede un'operazione esterna con segno 32bit; `fromEpoch` non ne esegue uno. Il risultato 1901, spesso citato, di dicembre può essere derivato per il wrap in complemento a due, ma affermare che ogni sistema interessato esegue il wrap anziché rifiutare, saturare o corrompere andrebbe oltre le prove. Testare il confine effettivo.
Se un cast esterno esegue il wrapper dell'aritmetica in complemento a due, ispeziona i bit memorizzati risultanti e il valore negativo decodificato. Non dedurre l'avvolgimento esclusivamente da una data storica inaspettata.
Si verifica l'esatto istante superiore; il comportamento di wrap dipende dall'operazione sugli interi esterni
Cerca schemi, definizioni di protocollo e layout binari per campi con segno 32-bit che contengono secondi di epoca. Una colonna SQL denominata INTEGER non è una prova sufficiente su tutti i motori e una piattaforma incorporata non è automaticamente interessata. Determina larghezza, segno, unità e codice di conversione per ciascun percorso.
Includere file e record memorizzati nella cache nel controllo. Un tipo in memoria ampliato può ancora scrivere un vecchio formato ristretto, mentre un database ampio può ricevere un valore client troncato. Crea dispositivi al massimo e uno oltre, quindi controlla i byte o il valore persistente anziché semplicemente verificare che una funzione abbia restituito successo.
Individua i campi epoch firmati 32-bit esaminando schemi e formati effettivi
La correzione concettuale è una rappresentazione il cui intervallo include le date richieste, in genere un conteggio dei segni più ampio o un tipo temporale appropriato. Il kernel della cartella di lavoro, la libc e la narrativa sulla migrazione del formato sono esterni a questi file sorgente. Ogni sistema ha la propria compatibilità e il proprio lavoro di distribuzione.
Allargare ogni confine come una modifica contrattuale coordinata. L'aggiornamento dello spazio di archiviazione senza un campo wire o di una libreria senza dati esistenti lascia un collegamento ristretto. Aggiungi il controllo delle versioni dove necessario e testa esplicitamente i vecchi lettori. La stessa definizione di epoca non ha bisogno di cambiare; il contenitore lo fa.
La pianificazione della migrazione deve includere il rollback e il comportamento delle versioni miste. Un nuovo scrittore che produce valori ampi può interrompere un vecchio lettore prima che qualsiasi data persistente raggiunga il confine del calendario.
Ampliare la rappresentazione è la soluzione fondamentale; le migrazioni del kernel e del formato sono specifiche del sistema
Converti 2,147,483,647 in secondi per ottenere `2038-01-19T03:14:07.000Z`; converti 2,147,483,648 per ottenere `2038-01-19T03:14:08.000Z`. Il passaggio fluido di un secondo dimostra che il percorso ToolAcre non ha dislivelli di 32 bit a quel valore.
Ora forza gli stessi numeri dei millisecondi. Cadono nel mese di gennaio 1970 perché i valori diventano circa venticinque giorni dopo lo zero. Questo confronto impedisce che un errore di unità venga erroneamente etichettato come un problema 2038. La larghezza e la scala del campo sono dimensioni indipendenti.
Questo confronto dimostra anche perché un convertitore è diagnostico piuttosto che vulnerabile: la selezione esplicita dell’unità determina la scala, mentre la rappresentazione più ampia del browser porta entrambi i valori.
Esempio realizzato: il convertitore attraversa il limite perché JavaScript La data non è firmata 32-bit secondi
Il repository verifica inoltre 4,294,967,295 secondi come `2106-02-07T06:28:15.000Z`, il conteggio massimo di 32 bit senza segno. Non verifica un rollover di GPS settimana né specifica un cliff di millisecondi firmato 64 bit, quindi gli argomenti nominati vengono omessi anziché generalizzati.
L'analisi dei confini dovrebbe seguire esattamente la tipologia in uso. Il passaggio da con segno a senza segno si estende in una direzione ma rimuove le date negative e crea comunque un bordo superiore. Una rappresentazione firmata più ampia generalmente preserva entrambe le direzioni, in base all’intervallo di date del consumatore.
Ogni falesia necessita della propria derivazione da larghezza, segnatura e unità. Raggruppare rollover non correlati sotto "2038" oscura quale campo binario richiede effettivamente la modifica.
Viene testato il limite 32-bit senza segno; altre scogliere con nome sono prove del deposito esterne
Un convertitore non può controllare il codice sorgente, i file binari, gli schemi di database o i dispositivi distribuiti. Mostra cosa significa un numero candidato e fornisce dispositivi concreti per i test. La ricerca statica, l'ispezione del tipo, i test di serializzazione e le prove di migrazione devono stabilire se un prodotto è sicuro.
Non chiudere un controllo perché il browser esegue il rendering di 2038 correttamente. Ciò verifica solo il percorso del browser. Seguire il valore dall'inizio alla fine, soprattutto attraverso i vincoli linguistici e i vecchi formati in cui può verificarsi un restringimento implicito.
Includere le dipendenze e le interfacce del fornitore in tale traccia. L'origine dell'applicazione può utilizzare un tipo ampio mentre una libreria nativa o un protocollo del dispositivo restringe lo stesso valore in modo invisibile.
Conclusione: l'epoca va bene, il problema è la larghezza intera e come il convertitore di timestamp Unix ti consente di controllare qualsiasi valore limite in UTC e l'ora locale
Il problema dell'anno 2038 è un limite di larghezza intera, non un difetto nell'aritmetica dell'epoca Unix. La conversione riuscita di ToolAcre su entrambi i lati rende visibile la separazione. Il sistema esterno fallisce solo se una delle sue rappresentazioni non può sostenere il conteggio successivo.
Utilizzare 2,147,483,647 e 2,147,483,648 come vettori di test adiacenti, verificare l'esatta persistenza e documentare l'unità e la firma. Le prove ad ogni confine sono più preziose di una generica lista di controllo di tecnologie apparentemente vulnerabili.
I vettori adiacenti dovrebbero attraversare un percorso di serializzazione reale, non solo un calcolo in memoria. È qui che un'applicazione nominalmente ampliata può rivelare una cucitura ancora stretta.