# Bug dell'anno 2038

Il bug dell'anno 2038 (abbreviato in Y2038) è un bug informatico che ha ripercussioni su alcuni software e sistemi embedded, 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 è utilizzato anche in software per altri sistemi operativi sviluppati in linguaggio 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 ed in grado di assumere valori sia positivi che negativi.
Usando questo metodo, l'istante temporale più lontano rappresentabile corrisponde alle ore 03:14:07 di martedì 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 manifesta 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.
Un'altra manifestazione del problema si ha con alcuni dispositivi Android nei quali, impostando oggi una data di sistema del 2038 si rende permanentemente inutilizzabile (brick) il dispositivo.
Va anche ricordato che molti sistemi embedded vengono messi in uso e mai aggiornati, per cui il problema su questa classe di dispositivi è ancor più grave che sul software ordinario, che può essere aggiornato nel periodo da qui al 2038.

## Soluzioni

Non è semplice risolvere il problema per le combinazioni attuali di processori, sistemi operativi e file system. Cambiare il tipo di time.h facendolo diventare un valore sempre intero signed ma a 64 bit sposta l'emergere del problema in avanti nel tempo di circa 290 miliardi di anni, ma rischia di rendere 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 sempre a 32 bit ma di tipo unsigned, cioè senza segno ed in grado di assumere valori solamente positivi, posticiperebbe il problema di 68 anni, spostandolo al 7 febbraio 2106, e 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 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 possono essere impiegati su macchine diverse di epoche diverse, cosa che comporta la persistenza del problema anche oltre la vita delle macchine stesse.
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

Il bug più noto di questa categoria è il Millennium bug, noto anche come "Y2K" o "bug dell'anno 2000". Come Y2038, anche il Millennium bug manifestò i propri effetti già anni prima della data fatidica (1° gennaio 2000).
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 rappresentando le ore di attività tramite un numero intero a 16 bit con il segno, che può avere valori compresi tra -32768 e 32767: 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 senza 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.
Un problema simile coinvolge il sistema GPS (Global Positioning System), che memorizza il numero della settimana in 10 bit e pertanto ogni 1024 settimane si azzera. Tale problema si è presentato la prima volta nel 1999, causando pochi problemi (all'epoca vi erano pochi dispositivi GPS in uso), poi nel 2019, causando varie interruzioni di servizio. Il prossimo evento sarà il 21 novembre 2038 (nonostante la coincidenza dell'anno non vi è un legame diretto con il bug descritto in questa voce). Il protocollo di comunicazione è stato nel frattempo sostituito da uno più evoluto (CNAV) che usa 13 bit, pertanto i dispositivi che usano il nuovo protocollo avranno questo problema solo nel 2137.