Upiorne bugi. Małe błędy - wielkie katastrofy.

Błędy w oprogramowaniu zdarzają się często. Wiele z nich wychwytujemy jeszcze na etapie pisania, inne – podczas testów. Zdarzają się jednak bugi, których nikt nie zauważył. Niektóre z nich doprowadziły do spektakularnych katastrof, a nawet do śmierci ludzi. 

Jako ciekawostkę, a może i przestrogę, przedstawiamy subiektywną listę 6 dużych katastrof i awarii, jakie powstały na skutek błędów w oprogramowaniu.

 

1. Boeing 787 Dreamliner

 

Zapewne nie raz widzieliście ten samolot na zdjęciach, a może mieliście okazję nim lecieć (LOT ma takie na wyposażeniu). W 2015 roku głośno było o błędzie programistycznym, którego skutkiem był brak zasilania w Boeingu 787. Problem pojawiał się, gdy generatory Dreamlinera nie były wyłączane przez 248 dni.

Bug wykryła agencja FAA, która nadzoruje amerykańskie lotnictwo. Doszło tutaj do integer overflow w liczniku w oprogramowaniu generatorów, co sprawiało, że przestawały dostarczać zasilanie do urządzeń samolotu. Na szczęście nie doszło z tego powodu do żadnego groźnego incydentu, a Boeing przygotował łatkę do oprogramowania.



2. Rakiety Patriot

 

Niestety, przywołujemy tragiczne wydarzenie, które kosztowało życie 28 żołnierzy z amerykańskiej bazy w Dahahran. Tragedia miała miejsce 25 lutego 1991 roku, gdy toczyła się wojna w Zatoce Perskiej. Na bazę wystrzelono iracką rakietę Scud, która teoretycznie nie powinna stanowić zagrożenia, ponieważ żołnierze byli osłonięci przez mobilny system ziemia-powietrze, znany powszechnie jako Patriot.

System doceniany jest ze względu na wysoką skuteczność, a jednak tamtego dnia coś nie zadziałało i iracki Scud bez przeszkód zniszczył koszary. Wszystko przez podobny bug jak w przypadku Dreamlinera. Informacja o tym pojawiła się rok po tragedii w Dahahran w raporcie komisji Kongresu General Accounting Office. Okazało się, że gdy rakiety Patriot działały długo bez restartu, konwersja czasu stawała się coraz bardziej nieprecyzyjna. System w Dahahran nie był restarowany przez co najmniej 100 godzin, co wywołało błąd konwersji czasu w wymiarze 1/3 sekundy i dlatego Patriot nie mógł namierzyć rakiety Scud.

Co ciekawe, patch do oprogramowania został wypuszczony dzień po tragedii - czyli bug odkryto już wcześniej.

 

3. Ariane 5

 

Lancement Ariane 5 GIF by CNES

Tym razem przenosimy się do 1996 roku. Jest 4 czerwca. Europejska Agencja Kosmiczna ESA z dumą prowadzi transmisję z wystrzelenia Ariane 5. Już 30 sekund po starcie rakieta zbacza z kursu, a chwilę później ulega zniszczeniu. 10 lat pracy i 7 mld dolarów zamienia się w zgliszcza.

Co się okazuje? Integer overflow! W oprogramowaniu napisanym w języku Ada doszło do przekroczenia zakresu liczb. Wszystko przez to, że skopiowano oprogramowanie i koordynaty z wcześniejszej rakiety – Ariane 4, która znacznie różniła się od Ariane 5.

Śledztwo wykazało, że oprogramowanie transformowało 64-bitowe dane zmiennoprzecinkowe na 16-bitowe wartości całkowite. W ten sposób powstała zbyt duża liczba całkowita, a dodatkowo zabrakło kodu, który testuje przekroczenie zakresu liczb. Doszło do przeciążeń, a w konsekwencji system wymusił autodestrukcję Ariane 5.



4. Therac-25

 

To chyba najbardziej znany przykład błędu programistycznego w historii, który kosztował życie pięciu osób (zmarli na chorobę popromienną), a szósta została dotkliwie poparzona. Śledztwo wykazało, że oprogramowanie maszyny do radioterapii nowotworów Therac-25 zostało napisane w Asemblerze przez tylko jednego programistę, który dokonał kilku przeoczeń. Nie przeprowadzono dokładnych testów, a w dodatku kod został zaimplementowany do nowszego modelu maszyny niż pierwotnie zakładano.

Therac-25 posiadał dwa tryby działania: niskoenergetyczny oraz wysokoenergetyczny, który emitował nawet 100 razy większą dawkę promieniowania. Kiedy operatorzy zbyt szybko zmienili tryb pracy urządzenia, pojawiał się bug nazywany często „wyścig” – wysyłane były dwie instrukcje i ta, która pierwsza docierała do Therac-25, ustawiała odpowiedni tryb urządzenia. To sprawiało, że pacjenci często otrzymywali zbyt duże dawki promieniowania.



5. Mars Climate Orbiter

 

Wpadka NASA, 1999 rok. 23 września, dokładnie po 10 miesiącach lotu, amerykańska sonda Mars Climate Orbiter, warta 700 mln dolarów, dotarła do czerwonej planety. Wkrótce rozpoczęła się procedura wchodzenia w atmosferę Marsa, w czasie której zanika sygnał urządzeń. Niestety, kontaktu już nie odzyskano, ponieważ sonda spłonęła w atmosferze planety.

Jak to często bywa, błąd był banalny. Poszczególne części software’u były kodowane w różnych krajach, więc programiści używali odmiennych jednostek metrycznych. To wszystko spowodowało błędne działanie dopalaczy lądownika. W rezultacie silniki pracowały z większą mocą niż powinny i Mars Climate Orbiter zakończył tragicznie swoją misję.

Podobny obraz



6. Mariner 1

 

To błąd nazywany często „najdroższym myślnikiem w historii”. O co chodzi? Sprawa dotyczyła rakiety, która miała wynieść na orbitę sondę Mariner 1. NASA wystrzeliła ją 22 lipca 1962 roku. Po 4 minutach i 55 sekundach trzeba było jednak zniszczyć rakietę, ponieważ nie udało się zmienić jej niewłaściwej trajektorii lotu. Winowajcą okazał się znowu bug w oprogramowaniu.

Kod został napisany przez programistę odręcznie w zeszycie i zabrakło w nim myślnika „-”.

To doprowadziło do katastrofy. Górne podkreślenie, o którym zapomniano, powinno pojawić się nad symbolem promienia. Ten znak oznacza funkcję koordynowania lokalizacji, a cała formuła miała za zadanie obliczać wartość pochodnej czasowej promienia. Bez tego myślnika minimalne zmiany prędkości rakiety zostały zinterpretowane jako duże i wyłączyły się procedury korekty lotu.

 

Te wszystkie katastrofy i wypadki doskonale pokazują, jak ważne jest gruntowne testowanie oprogramowania i jak istotna jest rola testera. O tym zawodzie pisaliśmy już tutaj. A żeby dmuchać na zimne, popraw swoje code review unikając 7 najczęstszych błędów.