30 listopada 2008

5 najbardziej spektakularnych błędów oprogramowania

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-25


Therac-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 2003


14 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 1


22 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 1

2 miejsce
Masakra w Dhahran


25 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 501


Choć 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!".

13 komentarzy:

Anonimowy pisze...

Odnośnie rakiet Patriot czytałem nieco inną wersję tej historii. Rakiety zawodziły, jeśli zbyt długo pozostawały w stanie gotowości bojowej. Jeden z liczników zrealizowano tam jako liczbę zmiennoprzecinkową, a jego wartość za każdym razem zwiększano o 0,1. Jednak 0,1 nie jest dokładnie reprezentowana w arytmetyce zmiennoprzecinkowej o podstawie 2, przez co z biegiem czasu błąd się kumulował i powodował różne nieprzewidziane efekty.

Anonimowy pisze...

Abstrahując nieco od tematu wydaje mi się, że nie na miejscu jest pisać iż to Amerykankom zdarzają się najbardziej spektakularne klęski. Należy pamiętać, że wiele systemów jakie buduje się w USA są pionierskie, a co za tym idzie pewne rzeczy mogą nie do końca działać tak jak się tego spodziewamy.

Anonimowy pisze...

"masakra" bo zginelo 28 amerykanow z USA? a co gdy ginie kilkaset cywilow, albo tysiace cywilow z ich rąk? to jest masakra, z rakieto co najwyzej mozna to uznac za wypadek, lub niezla wpadke

Anonimowy pisze...

@zyx- tez tak slyszazlem. wystarczylo iterować licznik o jakas liczbe, ktora w iee754 jest przedstawiana dokladnie.

Anonimowy pisze...

ja bym tylko w drugim przypadku poprawił Irańczycy na Irakijczycy bo to o nich się rozchodzi a są to dwie różne nacje.

Anonimowy pisze...

Nie "rzutowanie" tylko "konwersja typów".

Anonimowy pisze...

Ontario nie leży w USA tylko Kanadzie

pozdr. ;)

michal pisze...

proponuję dodać:
http://edition.cnn.com/TECH/space/9909/30/mars.metric.02/

z tego co pamiętam jak kiedyś czytałem to oprogramowanie sondy powstawało w kilku krajach. Problem był taki, że w niektórych krajach używa się stóp a w innych metrów. ;) No i niestety się moduły nie zgrały. :D

Anonimowy pisze...

No przecież jest napisane, że Ontario leży w Kanadzie .. ehh

npb pisze...

Bo poprawiam błędy na bieżąco ;)

RadioErewan pisze...

Spektakularny to pojemne słowo. Nie kumam dlaczego akurat rakieta Ariane miała by być bardziej spektakularna od blackoutu i jak to porównać do zabicia 5 osób przez maszynę do naświetlań...
http://en.wikipedia.org/wiki/Mars_Polar_Lander też głupie i podobnie jak MCO koszty powyżej 100M$. Najbardziej spektakularnej pomyłki też brakuje - efektu Y2K.

Anonimowy pisze...

Tylko nie daj się nie-rzutującym, poprawnościowym anonimom!

Anonimowy pisze...

Programiści nie testują programów. No... może w małym stopniu (testy jednostkowe). Testują testerzy :)