Il problema dell'anno 2038 (Y2K38) spiegato
Il 19 gennaio 2038 alle 03:14:07 UTC, il timestamp Unix 2.147.483.647 — il valore massimo di un intero con segno a 32 bit — andrà in overflow. Ecco cosa significa, quali sistemi sono interessati e perché la maggior parte del codice moderno è già al sicuro.
Cos'è il problema dell'anno 2038?
I timestamp Unix sono tradizionalmente memorizzati come intero con segno a 32 bit che conta i secondi dal 1° gennaio 1970 00:00:00 UTC. Il valore massimo di un intero con segno a 32 bit è 2,147,483,647, che corrisponde al 19 gennaio 2038 alle 03:14:07 UTC. Un secondo dopo, l'intero va in overflow a -2,147,483,648. Interpretato come timestamp Unix, quel valore negativo corrisponde al 13 dicembre 1901, riportando i sistemi colpiti quasi 137 anni nel passato.
I valori dell'overflow
- 2^31 − 1 = 2,147,483,647 (intero con segno a 32 bit massimo)
- 2,147,483,647 come data = 19 gennaio 2038 03:14:07 UTC
- 2,147,483,647 + 1 va in overflow a −2,147,483,648 (il valore a 32 bit più negativo)
- −2,147,483,648 come data = 13 dicembre 1901 20:45:52 UTC
Quali sistemi sono a rischio?
Il problema riguarda i sistemi che memorizzano i timestamp come interi con segno a 32 bit:
- Sistemi embedded e microcontrollori con time_t a 32 bit
- Codice C e C++ legacy compilato per target a 32 bit che usa time_t o int per i timestamp
- Vecchi kernel Linux (precedenti al 5.6) su hardware a 32 bit ancora in produzione
- Colonne TIMESTAMP di MySQL — limitate al 2038-01-19; usa invece DATETIME
- Alcuni protocolli di rete e formati di file che codificano i timestamp come valori a 32 bit
- Firmware in sistemi di controllo industriale e dispositivi IoT con vita utile di decenni
Quali sistemi sono sicuri?
La maggior parte del codice e dell'infrastruttura moderni non è già più interessata:
- Qualsiasi SO a 64 bit — Linux (glibc 2.34+ corregge anche l'hardware a 32 bit), macOS, Windows
- Python — i timestamp usano float a 64 bit, sicuri ben oltre l'anno 292 milioni
- JavaScript — Date usa float IEEE 754 a 64 bit, sicuro fino all'anno 275,760
- Go e Rust — usano int64 internamente, sicuri per miliardi di anni
- Java — java.time.Instant usa long (64 bit), sicuro fino all'anno ~292 milioni
- PostgreSQL TIMESTAMP — memorizza correttamente le date oltre il 2038
- MySQL DATETIME — intervallo 1000-01-01 a 9999-12-31, non interessato
FAQ sul problema dell'anno 2038
- Cos'è il problema dell'anno 2038?
- Il problema dell'anno 2038 (Y2K38) è un bug per cui i sistemi che usano interi con segno a 32 bit per memorizzare i timestamp Unix andranno in overflow il 19 gennaio 2038 alle 03:14:07 UTC. Il valore massimo di un intero con segno a 32 bit è 2,147,483,647. Un secondo dopo, l'intero passa a -2,147,483,648, che corrisponde al 13 dicembre 1901.
- Qual è il timestamp Unix del 19 gennaio 2038?
- Il timestamp Unix del 19 gennaio 2038 alle 03:14:07 UTC è 2,147,483,647 — il valore massimo di un intero con segno a 32 bit (2^31 - 1). È il momento esatto in cui avviene l'overflow dell'anno 2038 sui sistemi a 32 bit.
- Y2K38 è lo stesso di Y2K?
- No. Il Y2K (problema dell'anno 2000) era causato da programmi che memorizzavano gli anni con 2 cifre. Il Y2K38 è causato dalla memorizzazione dei timestamp Unix come interi con segno a 32 bit che vanno in overflow nel 2038. Cause diverse, sistemi interessati diversi.
- Internet si romperà nel 2038?
- Probabilmente non in modo significativo. La maggior parte dell'infrastruttura di internet è già migrata a sistemi a 64 bit. Il rischio si concentra su sistemi embedded, dispositivi IoT datati e software non aggiornato da decenni. Sistemi operativi, linguaggi e database moderni sono già sicuri.