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 potrebbe avere ripercussioni su alcuni software, 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 è presente anche in software per altri sistemi operativi 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 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 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.[2][3]

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

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

  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. ^ Unununium Time, su unununium.org, 8 aprile 2006. URL consultato il 22 agosto 2019 (archiviato dall'url originale l'8 aprile 2006).
  5. ^ Java API documentation, Sun Microsystems, su docs.oracle.com. URL consultato il 22 agosto 2019.
  6. ^ Alcuni SSD di HPE muoiono dopo 32.768 ore: facciamo chiarezza (e ricordiamoci dei backup), su Hardware Upgrade. URL consultato il 1º gennaio 2020.

Voci correlate

[modifica | modifica wikitesto]

Collegamenti esterni

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