Vai al contenuto

Bug dell'anno 2038

Da Wikipedia, l'enciclopedia libera.
Manuali per la programmazione UNIX.

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.

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.[1] Il problema è chiamato "Year 2038", "Y2038", "Y2K38" o "Y2.038K".

Esempio che mostra l'azzeramento della data.

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.[2][3]

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.[4]

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.

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.[5][6]

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.[7]

Un problema simile coinvolge il sistema GPS (Global Positioning System), che memorizza il numero della settimana in 10 bit e pertanto ogni 1024[8] settimane si azzera.[9] 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.

  1. ^ Welcome to The Year 2038 Bug Site, su 2038bug.com. URL consultato il 22 agosto 2019 (archiviato dall'url originale il 1º gennaio 2014).
  2. ^ The Future Lies Ahead, su The American Caliban, 28 giugno 2006. URL consultato il 22 agosto 2019.
  3. ^ Something wrong after 2006-05-12 21:25, su mail-archive.com. URL consultato il 22 agosto 2019.
  4. ^ ZTE Blade running Android 2.2 has 2038 problems, su issuetracker.google.com. URL consultato il 20 novembre 2018 (archiviato dall'url originale il 19 maggio 2022).
  5. ^ Unununium Time, su unununium.org, 8 aprile 2006. URL consultato il 22 agosto 2019 (archiviato dall'url originale l'8 aprile 2006).
  6. ^ Java API documentation, Sun Microsystems, su docs.oracle.com. URL consultato il 22 agosto 2019.
  7. ^ Alcuni SSD di HPE muoiono dopo 32.768 ore: facciamo chiarezza (e ricordiamoci dei backup), su Hardware Upgrade. URL consultato il 1º gennaio 2020.
  8. ^ Il massimo numero memorizzabile in 10 bit è 10²-1 cioè 1023.
  9. ^ (EN) The April 2019 Global Positioning System (GPS) Week Number Rollover, su Energy.gov. URL consultato il 14 marzo 2019.

Voci correlate

[modifica | modifica wikitesto]

Collegamenti esterni

[modifica | modifica wikitesto]
  Portale Sicurezza informatica: accedi alle voci di Wikipedia che trattano di sicurezza informatica