Κυριακή 11 Δεκεμβρίου 2011

Το έτος 2038 μπορεί να καταστρέψει τον κόσμο!

 Οι υπολογιστές έχουν μια παράξενη σχέση με τις ημερομηνίες: όταν μια ημερομηνία δεν βγάζει νόημα για το σύστημα, είναι απρόβλεπτη η συμπεριφορά του. Αυτό ήταν η βάση για το φόβο του Y2K, πως οι υπολογιστές που χρησιμοποιούσαν δύο ψηφία για την ημερομηνία ('95, '98, '99) όταν έφταναν στο 2000 ('00) θα νόμιζαν πως η ημερομηνία είναι 1900. Μπορεί τελικά το Millenium bug να μην αποδείχτηκε στην πράξη ούτε στο ελάχιστο τόσο καταστροφικό όσο έκραζαν οι Κασσάνδρες (που προειδοποιούσαν για βιβλική καταστροφή και το τέλος του πολιτισμού), όμως το έτος 2038 εξακολουθεί να είναι εξαιρετικά επικίνδυνο για τα 32-bit Unix συστήματα - και μπορεί να καταστρέψει το κινητό σας ή και συστήματα στο αυτοκίνητό σας...
 
 
 Τις προάλλες άλλαζα την ημερομηνία στο ZTE Blade κινητό μου στα πλαίσια ενός σοβαρού επιστημονικού πειράματος (βασικά, σαν ένα cheat για το παιχνίδι Paradise Island 1.0.2 :P ). Όταν έφτασα στο 2037, το σύστημα αρνούταν να δεχτεί το 2038. Περίεργος στο γιατί συμβαίνει αυτό, ρύθμισα το κινητό στις 31/12/2037, 23:59. Ένα λεπτό αργότερα, ήμουν στην 1/1/2038 χωρίς πρόβλημα. Δεν μπορούσα όμως να πάω στην 1/2. Ούτε όμως και στις 30/1.
Αντί, σαν σώφρων άνθρωπος, να εγκαταλείψω την προσπάθεια, πειραματιζόμενος έφτασα μέχρι τις 19 Ιανουαρίου, και στη συνέχεια άρχισα να πειραματίζομαι με την ώρα. Λίγα λεπτά μετά, το Blade μου κόλλησε τόσο που χρειάστηκε να βγάλω τη μπαταρία για να κλείσει. Όταν την ξανάβαλα και το ξανάνοιξα, δεν έμπαινε καθόλου στο λειτουργικό, μόνο κόλλαγε σε ένα Infinite loop καθώς έδειχνε το σήμα του Android.
Διαβάζοντας στο internet, ανακάλυψα για το πρόβλημα του Unix με το 2038. Για την ακρίβεια, η επικίνδυνη ημερομηνία δεν είναι η 1/1/2038, αλλά η 19η Ιανουαρίου 2038 και ώρα 3:14:07 UTC.
Μοιάζει λίγο τυχαίο για πρόβλημα που επηρεάζει σχεδόν όλα τα 32-bit Unix-οειδή συστήματα, έτσι δεν είναι? Δηλαδή, τι το ξεχωριστό έχει η συγκεκριμένη ημερομηνία και ώρα?
Η απάντηση είναι απλή. Πολλά λειτουργικά συστήματα (συμπεριλαμβανομένου του Android τουλάχιστον μέχρι την έκδοση 2.2) αποθηκεύουν την ημερομηνία και την ώρα σαν ένα προσημασμένο 32-bit ακέραιο αριθμό στο δυαδικό σύστημα. Ο αριθμός αυτός εκφράζει το πόσα δευτερόλεπτα έχουν περάσει από την Πέμπτη, 1η Ιανουαρίου του 1970, στις 0:00:00 μέχρι σήμερα.
Εφ' όσον λοιπόν η 1η Ιανουαρίου του '70 είναι η ημερομηνία "μηδέν", εκφράζεται στο 32-bit δυαδικό σύστημα σαν 00000000 00000000 00000000 00000000.
Στις 3:14:07 της 19ης Ιανουαρίου 2038, έχουν περάσει 2.147.483.647 δευτερόλεπτα από την ημερομηνία του 1970. Ο αριθμός αυτός, στο δυαδικό σύστημα εκφράζεται ως εξής:
01111111 11111111 11111111 11111111.
Ένα δευτερόλεπτο αργότερα, ο δυαδικός γίνεται
10000000 00000000 00000000 00000000
Όπως αναφέραμε, ο ακέραιος αυτός είναι προσημασμένος, και άρα το πρώτο bit στο μετρητή είναι αυτό που δείχνει το πρόσημο (0 για θετικούς αριθμούς, 1 για αρνητικούς). Εφ' όσον όλα τα προηγούμενα λειτουργικά bits έχουν εξαντληθεί, το σύστημα αναγκαστικά αλλάζει το πρώτο bit. Ουσιαστικά, δηλαδή, από το 2.147.483.647 πηγαίνει στο -2.147.483.647 και συνεχίζει να μετράει, αντίστροφα πλέον, προς το μηδέν (-2.147.483.646, ...645, ...644 κλπ).
Δείτε σε αυτό το gif της Wikipedia το πρόβλημα στην πράξη:
Year_2038_problem
Αυτό το πρόβλημα δεν επηρεάζει μόνο τα λειτουργικά συστήματα που υπολογίζουν την ημερομηνία με αυτό τον τρόπο (Unix-οειδή ή μη), αλλά και εφαρμογές που μπορεί να υπολογίζουν μελλοντικές ημερομηνίες. Στα συστήματα αυτά, μάλιστα, το πρόβλημα θα εμφανιστεί νωρίτερα από το έτος 2038. Για παράδειγμα, αν ένα πρόγραμμα δουλεύει με ημερομηνίες 20 χρόνων στο μέλλον, θα εμφανίσει πρόβλημα από το 2018.
Τα συστήματα που είναι πιο ευαίσθητα σε αυτό το πρόβλημα είναι ενσωματωμένα συστήματα. Για παράδειγμα, στα αυτοκίνητα τέτοια συστήματα κάνουν υπολογισμούς για λειτουργίες ο έλεγχος του ABS, του electronic stability control (ESC/ESP), το traction control (TCS) και η αυτόματη λειτουργία 4x4. Σε σύγχρονα αεροσκάφη, ενσωματωμένα συστήματα ρυθμίζουν θέματα πλοήγησης ή του GPS. Και, φυσικά, όπως έμαθα με το δύσκολο τρόπο, συσκευές τηλεπικοινωνίας, όπως κινητά και άλλες συσκευές δικτύωσης είναι επίσης ευαίσθητα στο πρόβλημα.
Παρ' ότι οι υπολογιστές αργά αλλά σταθερά πηγαίνουν προς τα 64 bit, τα περισσότερα ενσωματωμένα συστήματα συνεχίζουν και χρησιμοποιούν 8bit ή 16bit μικροεπεξεργαστές. Επίσης, σε αντίθεση με τους υπολογιστές, όπου κάθε γενιά τεχνολογίας ορίζεται σε ένα διάστημα 18-24 μηνών, τα ενσωματωμένα αυτά συστήματα έχουν σχεδιαστεί για να διαρκούν όσο το σύστημα στο οποίο βρίσκονται ενσωματωμένα (αυτοκίνητο, αεροπλάνο κλπ). Είναι λοιπόν αναμενόμενο αρκετά από αυτά να συνεχίσουν να βρίσκονται σε λειτουργία μέχρι την επικίνδυνη ημερομηνία. Ταυτόχρονα, η αλλαγή του software σε αυτά τα συστήματα είτε δεν είναι πρακτική, είτε είναι απλά αδύνατη, πράγμα που σημαίνει πως θα πρέπει να αντικατασταθούν εξ' ολοκλήρου.
Επιπλέον, το 2038 μπορεί να επηρεάσει δομές δεδομένων, όπως file systems (όπως πολλά inode file systems που ακόμα χρησιμοποιούνται), βάσεις δεδομένων με 32-bit time fields, βάσεις δεδομένων COBOL από το '70, '80 και '90, υποσυστήματα εργοστασίων για ποιοτικούς ελέγχους και διάφορες ιατρικές και στρατιωτικές συσκευές.
Αυτή τη στιγμή δεν υπάρχει μία καθολική λύση για το πρόβλημα του 2038. Κάθε αλλαγή στον ορισμό των time_t δεδομένων θα έφερνε ασυμβατότητα στον κώδικα που βασίζεται στη μορφή του time_t ακεραίου για τον υπολογισμό της ημερομηνίες. Αν, ας πουμε, αντί για προσημασμένος ο 32-bit ακέραιος γινόταν χωρίς πρόσημο (υπολογίζοντας και το πρώτο bit στον αριθμό και επεκτείνοντας την ημερομηνία μέχρι το 2106), τότε θα είχαν πρόβλημα προγράμματα που υπολογίζουν ημερομηνίες πριν το 1970, καθώς αυτές οι ημερομηνίες υπολογίζονται με αρνητικούς αριθμούς.
Πάντως, τα λειτουργικά συστήματα που είναι σχεδιασμένα για να τρέχουν σε 64-bit hardware ήδη χρησιμοποιούν 64-bit time_t ακεραίους, πράγμα που σημαίνει πως θα εμφανίσουν πρόβλημα σε 292 δισεκατομμύρια χρόνια (την Κυριακή 4 Δεκεμβρίου του 292.277.026.596, για την ακρίβεια).
2038
Όσο για το κινητό μου? Μην έχοντας επιλογή να μπω σε κάποιου είδους BIOS για να διορθώσω την ημερομηνία, δοκίμασα να φλασάρω ένα νέο ROM με το Clockwork, πράγμα που δυστυχώς δεν λειτούργησε. Τελικά, μετά από μερικές ώρες ανησυχίας πως το κινητό μου πλέον ήταν λιγότερο χρήσιμο κι από τούβλο (και μάλλον έχοντας καταργήσει την εγγύηση με τα τόσα φλασαρίσματα), κατάφερα να το επιδιορθώσω, εφαρμόζοντας ένα ROM με τη μέθοδο Total Phone Transfer. Αν δεν είχα αυτή την επιλογή (όπως για παράδειγμα, αν το κινητό μου ήταν iPhone) παίζει και να μην μπορούσα να το επιδιορθώσω.
Ηθικό δίδαγμα? Αν το κινητό δεν θέλει να βάλει μια συγκεκριμένη ημερομηνία, μην το πιέζετε, γιατί παίζει να σας κρατήσει μούτρα, ίσως και για πάντα...