title: Bug dell'anno 2038
text: # Bug dell'anno 2038
  
  Il bug dell'anno 2038 (abbreviato in Y2038) è un bug informatico che potrebbe avere ripercussioni su alcuni software, riguardante la gestione di date relative all'anno 2038 e successivi.
  
  ## Problema
  
  Il problema riguarda programmi che usano la rappresentazione POSIX per calcolare il tempo: essa calcola la data e l'ora del sistema sulla base del numero di secondi trascorsi dalla mezzanotte del 1º gennaio 1970 (ignorando i secondi intercalari). Questo tipo di sistema è lo standard per i sistemi Unix ed è presente anche in software per altri sistemi operativi che siano stati sviluppati in C. Sulla maggior parte dei sistemi a 32 bit il dato time.h, usato per questo calcolo, è rappresentato tramite un numero intero a 32 bit di tipo signed, ovvero con il segno.
  
  Usando questo sistema, l'istante temporale più lontano rappresentabile corrisponde alle ore 03:14:07 del 19 gennaio 2038 (UTC). Dopo questo momento il contatore supererebbe il valore massimo ed indicherebbe un numero negativo, quindi i computer restituirebbero una data corrispondente non al 2038 ma al 1901 (precisamente le 20:45:52 UTC di venerdì 13 dicembre 1901), causando errori di calcolo. Il problema è chiamato "Year 2038", "Y2038", "Y2K38" o "Y2.038K".
  
  Il bug si può manifestare anche prima del 2038, se viene richiesto di operare con date corrispondenti o successive all'istante incriminato; ciò accadde, per esempio, nel 2006 al server web AOLserver, che gestiva le richieste senza scadenza al proprio database assegnando alle stesse una data di scadenza pari ad un miliardo di secondi dopo la loro immissione. Alle 21:27:28 del 12 maggio 2006, esattamente un miliardo di secondi prima delle 03:14:07 del 19 gennaio 2038, il sistema di calcolo superò il limite critico, restituendo una data di scadenza nel passato e causando un crash del sistema.
  
  ## Soluzioni
  
  Non è semplice risolvere il problema per le combinazioni attuali di processori, sistemi operativi e file system. Cambiare il valore di time.h per usare un sistema a 64 bit renderebbe il sistema incompatibile con software, sistemi di memorizzazione e tutti gli strumenti che usano una rappresentazione binaria del tempo. Cambiare time.h in un intero da 32 bit ma di tipo unsigned, cioè senza segno, permetterebbe di posticipare il problema di 68 anni, spostandolo al 7 febbraio 2106, ma causerebbe comunque problemi a molti programmi.
  
  Molti sistemi operativi per sistemi a 64 bit usano già variabili intere a 64 bit per il time.h. Il passaggio a questo tipo di architetture è in corso e ci si aspetta che sia completo prima del 2038. Esistono ancora, tuttavia, centinaia di milioni di sistemi a 32 bit sul mercato, di cui molti in sistemi integrati. Nonostante l'attuale ritmo di aggiornamento dei computer ogni 18-24 mesi, i computer integrati possono lavorare senza interruzioni per tutta la vita del sistema che controllano. L'uso del temporizzatore time.h a 32 bit è anche stato inserito in vari formati di file, che ovviamente possono essere aperti su macchine diverse di epoche diverse, cosa che comporta la persistenza del problema anche oltre la vita delle macchine stesse. L'uso di un valore intero signed a 64 bit sposta l'emergere del problema in avanti nel tempo di circa 290 miliardi di anni.
  
  Sono state avanzate anche varie proposte alternative, alcune delle quali in uso, per sfruttare questo spostamento eccessivo della data massima calcolabile: tra queste vi è l'includere nel calcolo i millisecondi o i microsecondi, abbreviando la vita utile delle macchine a 300.000 anni.
  
  ## Bug simili
  
  Un bug molto simile a quello dell'anno 2038 è quello che interessa alcune unità SSD di HPE, che dopo 32.768 ore smettono di funzionare. Il firmware di queste unità è stato programmato utilizzando un numero intero a 16 bit con segno per rappresentare le ore di attività: ciò si traduce in un numero massimo rappresentabile di 32.768 ore, ovvero 3 anni, 270 giorni e 8 ore. Per fare un confronto, utilizzando un numero a 32 bit con segno si otterrebbe un massimo di 2.147.836.648 ore, equivalenti all'incirca a 245.000 anni. Superata la soglia fatidica delle 32.768 ore, le unità SSD in questione diventano inutilizzabili e i dati in esse contenuti vengono persi per sempre.
  
  