Informatyka jest wszędzie. Programy komputerowe otaczają nas zewsząd. W banku, w szpitalu, na ulicach, w elektrowniach. Nawet nie wiemy jak wiele zależy w naszym życiu od tego czy programy te zostały rzetelnie przetestowane przez programistów. Przedstawiam ranking 5 najbardziej spektakularnych błędów w oprogramowaniu. Błędy te pochłonęły miliony dolarów, a co gorsza - w wyniku tych błędów zginęli ludzie.
5 miejsce
Therac-25Therac-25 jest maszyną do radioterapii. Między 1985 a 1987 rokiem odnotowano przynajmniej 6 przypadków w których pacjentom podano za dużą dawkę promieniowania. Pacjenci zachorowali na chorobę popromienną. Pięciu z nich z tego powodu zmarło.
Powodem był błąd oprogramowania spowodowany tak zwaną sytuacją wyścigu (race condtition). Z sytuacją taką mamy do czynienia na przykład gdy wynik działania jakiegoś procesu zależy od zgrania z czasem lub innych zdarzeń (procesów). Problem ten jest skomplikowany i nie będę się tu nim zajmował. Osób zainteresowanych tym tematem odsyłam do
artykułu Michała Wojciechowskiego.
4 miejsce
Blackout 200314 sierpnia 2003 roku miała miejsce największa awaria zasilania w historii. Odciętych od prądu zostało 50 mln ludzi. W USA całkowicie od prądu zostały odłączone stany Ohio, Nowy Jork, New England, Massachusetts, Connecticut, Michigan, Pensylwania oraz północne New Jersey. W Kanadzie prowincja Quebec i Ontario. W wyniku awarii zostało wyłączonych 100 elektrowni (w tym 22 atomowe), przestały kursować pociągi, stanęły windy, ulice zostały zakorkowane z powodu braku sygnalizacji świetlnej. Na kilku lotniskach zawieszono loty. Działalność zawiesiła nowojorska giełda towarowa. Mieszkańcy stanu Michigan ucierpieli dodatkowo w wyniku braku wody, która dostarczana jest tam za pomocą pomp elektrycznych. W samym Nowym Jorku straż pożarna odnotowała 3000 zgłoszeń do pożarów (wywołanych zazwyczaj nieumiejętnym posługiwaniem się świeczkami). Awaria zasilania pochłonęła co najmniej 11 ofiar.
Na tą awarię złożyło się kilka czynników. Jednym z nich był błąd w programie w którym dochodziło do sytuacji wyścigu (patrz wyżej).
Wydanie specjalne wiadomości.3 miejsce
Mariner 122 lipca 1966 roku wystartowała sonda kosmiczna Mariner 1. Po 5 minutach lotu oficer bezpieczeństwa widząc nienormalne zachowanie się rakiety wydał polecenie autodestrukcji.
Błąd w oprogramowaniu wynikał... ze złego przepisania wzoru z kartki... Smutne, ale prawdziwe. Przepisujący nie zauważył kreski nad pochodną w czasie n-tego promienia. Kreska oznacza funkcję wygładzania. Bez tej kreski komputer traktował najmniejszą zmianę prędkości bardzo poważnie i wykonywał serię gwałtownych manewrów.
Straty szacuje się na około 18.5 mln $.
Zdjęcie startu Mariner 12 miejsce
Masakra w Dhahran25 lutego 1991 roku iracka rakieta typu SCUD trafia w barak w Dhahranie (Arabia Saudyjska) zabijając 28 amerykańskich żołnierzy. Zawiodło oprogramowanie systemu obrony przeciwlotniczej PATRIOT.
Zmienne zmiennoprzecinkowe mają taką własność, że małe liczby są zapamiętywane z dużą dokładnością, natomiast wielkie z niewielką dokładnością. Jest to bardzo przydatna własność. Gdy chcemy zmierzyć wielkość bakterii to błędy rzędu milimetra powodują, że nasze obliczania nadają się tylko do śmietnika. Jednak gdybyśmy chcieli zmierzyć odległość z Ziemi do Księżyca to jesteśmy w stanie zaakceptować błędy rzędu kilometrów.
Zegar (licznik) baterii patriot liczył czas w zmiennej całkowitej. Następnie w celu dalszych obliczeń ten licznik rzutowany był na liczbę zmiennoprzecinkową. Gdy wartość licznika była duża to błąd bezwzględny był również duży. Podczas gdy Irakijczycy wystrzelili rakietę, system PATRIOT działał już od ponad 100 godzin. Błąd zegara po zrzutowaniu na zmienną zmiennoprzecinkową wynosił około 1/3 sekundy. Co przy prędkościach pocisków balistycznych spowodowało błąd obliczenia celu pocisku o około 700 metrów! System PATRIOT zawiódł.
Amerykanie wiedzieli o tym błędzie. Odpowiednia poprawka oprogramowania była już w drodze. Do Arabii doszła dzień po tragedii.
Masakry można było uniknąć. Wystarczyło co kilka godzin zerować wartość licznika.
1 miejsce
Ariane Lot 501Choć to zazwyczaj Amerykanom zdarzały się spektakularne klęski, to niestety z bólem serca Europejczykom muszę przyznać pierwsze miejsce w tym rankingu.
4 czerwca 1996 roku. Z kosmodromu Kourou w Gujanie Francuskiej w swój pierwszy lot testowy wyrusza europejska rakieta Ariane 5. Po 37 sekundach lotu rakieta zeszła z kursu i została zniszczona przez system autodestrukcji. Straty szacuje się na około 370 mln $. Sam koszt wystrzelenia takiej rakiety to około 180 mln $.
Choć przed lotem próbnym przetestowano dokładnie cały sprzęt, to nie przetestowano oprogramowania. Bo i po co? Przecież został on niemal w całości skopiowany z Ariane 4, na którym to działał bez zarzutów. Jednak Ariane 5 miał szybsze silniki niż jego poprzednik, przez co oprogramowanie generowało większe liczby. Błąd pojawił się, gdy 64 bitową zmienną zmiennoprzecinkową program próbował zrzutować na 16-bitową zmienną całkowitą. Gdy wartość liczby 64-bitowej nie mogła się zmieścić w 16 bitach, komputer rzucił wyjątek (arithmetic overflow). Spowodowało to efekt domina - komputer zaczął rzucać serię kolejnych wyjątków. Końcowym efektem było zboczenie rakiety z kursu i autodestrukcja.
Film z feralnego lotu można znaleźć tutaj.
Starałem się rzetelnie opisać na czym polegały błędy w oprogramowaniu, choć szukając źródeł trafiałem bardzo często na sprzeczne ze sobą informacje. Niech nie zdziwi was zatem fakt, że być może znajdziecie w innych źródłach inne wyjaśnienia dotyczące błędów w opisanych przeze mnie sytuacjach.
Po tym artykule trochę inaczej będę podchodził do tego gdy mój ćwiczeniowiec znowu krzyknie: "Aha! Pana program źle działa dla takich danych wejściowych!".