Najsłynniejsze błędy programistyczne [cz. 1]
Błąd w kodzie to z reguły drobnostka, którą można naprawić łatką. Co jednak zrobić, gdy od pojedynczego symbolu zależy życie i zdrowie ludzi oraz cenny sprzęt? Mariner 1 uległ katastrofie z powodu brakującego znaku "‾". Niedopracowane oprogramowanie do maszyny do naświetlań kosztowało życie 5 osób. Oto przegląd największych wpadek programistycznych.
14.02.2013 | aktual.: 13.01.2022 12:37
Błąd w kodzie to z reguły drobnostka, którą można naprawić łatką. Co jednak zrobić, gdy od pojedynczego symbolu zależy życie i zdrowie ludzi oraz cenny sprzęt? Mariner 1 uległ katastrofie z powodu brakującego znaku "‾". Niedopracowane oprogramowanie do maszyny do naświetlań kosztowało życie 5 osób. Oto przegląd największych wpadek programistycznych.
Mariner 1
Żeglarz nr 1 kosztował w 1962 r. około 18,5 mln dol. Jak na te czasy była to kolosalna suma. Mariner 1 był wspólnym przedsięwzięciem NASA, JPL i USAF. Miała to być pierwsza misja planetarna USA i ciśnienie polityczne było przeogromne. Pośpiech i chęć wykazania się wzięły górę nad rozsądkiem i starannością, co poskutkowało najbardziej groteskową katastrofą w dziejach lotów kosmicznych.
Start rakiety odbył się 22 lipca. Jej celem była planeta Wenus, a znajdująca się na pokładzie sonda kosmiczna miała dostarczyć cennych danych na temat siostry Ziemi. Po 294 s lotu przesłano do rakiety polecenie autodestrukcji. Jeszcze wtedy nieznana usterka sprawiła, że Atlas Agena B zboczyła z kursu i kontynuowała zmianę kierunku lotu w zadziwiający sposób.
Przyczyny katastrofy były dwie. Co ciekawe, gdyby ta pierwsza się nie pojawiła, to druga również nie miałaby miejsca i wszystko poszłoby zgodnie z planem. Zaraz po starcie okazało się, że antena rakiety praktycznie nie odbiera żadnych sygnałów, w tym poleceń nawigacyjnych z centrum kontroli lotów. Konstruktorzy przygotowali się jednak na taką ewentualność i zawczasu opracowali plan B. Plan ten nakazywał komputerowi pokładowemu odcięcie niedokładnych sygnałów z anteny i uruchomienie oprogramowania awaryjnego, które miało kontynuować lot zgodnie z wcześniej ustalonym planem.
Tak też się stało, ale ku zgrozie zgromadzonych rakieta zaczęła się zachowywać bardzo dziwnie. Rozpoczął się gwałtowny cykl szybkich i znacznych korekt kursu lotu. Rakieta nie zdołała wyrównać lotu i kontrola misji była zmuszona zniszczyć pojazd przed uderzeniem w ziemię.
Po długim dochodzeniu okazało się, że w programie awaryjnym był malutki błąd w zapisie równania. Prawidłowa wersja widoczna jest poniżej. W oprogramowaniu zabrakło tej małej kreski na samej górze.
Kreska ta oznacza funkcję wygładzania. Bez niej wszystkie zmiany wartości prędkości były traktowane przez system nawigacyjny jako poważne i wywoływały gwałtowną korektę kursu. Arthur C. Clark nazwał tą kreskę "najdroższym dywizem w historii".
Therac-25
Historia kanadyjskiej maszyny do radioterapii nowotworów jest obecnie lekturą obowiązkową podczas studiów nad bezpieczeństwem systemów informatycznych, zwłaszcza związanych z medycyną. Tak jak w przypadku błędu Marinera usterka mogła pozostać w ukryciu przez wiele lat i nie wyrządzić nikomu krzywdy. Tak się jednak nie stało.
Maszyna miała dwa tryby działania. Pierwszy, niskoenergetyczny, bazował na strumieniu elektronów (od 5 MeV) i działał w krótkich interwałach. Drugi nazywał się Megavolt X-ray i emitował megawoltowe promieniowanie rentgenowskie (do 25 MeV).
Aby wywołać błąd, należało w ciągu 8 s wcisnąć następującą kombinację klawiszy na terminalu VT-100: "X" (pierwszy, przypadkowy wybór trybu "25MV photon"), "strzałka w górę", "E" (prawidłowy, poprawiony wybór trybu "25 MeV electron"), Enter.
Kombinacja ta powodowała uruchomienie wysokoenergetycznego trybu promieniowania bez przesłonięcia głowicy filtrem dyspersyjnym. W efekcie pacjent otrzymywał 100 razy silniejszą, skupioną wiązkę promieniowania skierowaną w jeden punkt na ciele. Jeden z pacjentów opisał to jako "porażenie prądem o niebywałym natężeniu".
Błąd pojawiał się przez zjawisko elektronicznego "hazardu". Dochodzi do niego wtedy, gdy informacja na wyjściu zależy od sekwencji i czasu wprowadzenia informacji na wejściu. W powyższej sytuacji sygnały wysyłane przez lekarza za pomocą terminalu były wprowadzone na tyle szybko, że ścigały się ze sobą o pierwszeństwo wpływu na działanie urządzenia.
Pięciu pacjentów zmarło na chorobę popromienną, a szósty doznał dotkliwych poparzeń. Dochodzenie w sprawie ujawniło poważne zaniedbania producenta - oprogramowanie było skopiowane z poprzednich, starszych modeli, a zabezpieczenia sprzętowe usunięte.
MIM-104 Patriot
Kolejny błąd programistyczny, który kosztował życie 28 żołnierzy. Tragedia rozegrała się w 1991 r., gdy żołnierze przebywali w jednostce wojskowej Dharhan, w Arabii Saudyjskiej. Rakieta Scud uderzyła w zabudowania, powodując straszliwe zniszczenia i śmierć.
Rakiety Scud nie były wówczas problemem dla armii amerykańskiej. Nad ich detekcją i unieszkodliwieniem czuwały rakiety przechwytujące Patriot. Jak się okazało, miały one drobny problem z zegarem systemowym.
Bateria Patriot była uruchomiona i działała bez przerwy przez 100 godz. Przez ten czas zegar systemu opóźnił się o 1/3 s. Ten niewielki ułamek spowodował, że system radarowy wykrył nadlatującą rakietę, ale przeskanował niewłaściwy obszar nieba i nie potwierdził zagrożenia. Patriot nie wystartował, a Scud uderzył w bazę.
Co ciekawe, 14 dni wcześniej wojsko izraelskie wykryło ten problem i poinformowało producenta oprogramowania (PATRIOT Project Office) o wadzie. Jako tymczasowe rozwiązanie zaproponowano cykliczne restarty systemu w celu ponownej kalibracji zegara. Niestety, operatorzy w Dharhan nie wiedzieli, jak często mają je wykonywać, i zaniechali stosowania tego środka. Dzień po tragedii pojawiła się łatka programistyczna i problem przestał istnieć. O jeden dzień za późno.