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

Błędy w oprogramowaniu zdarzają się często. Wiele z nich zostaje wychwyconych jeszcze na etapie kodowania, 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. Dziś przypominamy te niechlubne dla programistów wydarzenia.

Jako ciekawostkę, a poniekąd również przestrogę, przedstawiamy listę sześciu dużych katastrof i awarii, jakie powstały na skutek błędów w oprogramowaniu.

1. Boeing 787 Dreamliner

Zapewne widzieliście niejednokrotnie ten okazały statek powietrzny na zdjęciach, a może nawet mieliście okazję lecieć tą maszyną (znajduje się między innymi na wyposażeniu PLL LOT). W 2015 roku głośno było o błędzie programistycznym, którego skutkiem był brak zasilania w Boeingu 787. Problem ten 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 tzw. integer overflow w liczniku w oprogramowaniu generatorów, co sprawiało, że te przestawały dostarczać zasilanie do urządzeń samolotu. Na szczęście nie doszło do żadnego groźnego incydentu z tego powodu, a Boeing przygotował łatkę do oprogramowania.

2. Rakiety Patriot

Niestety, przywołujemy tragiczne wydarzenie, które kosztowało śmierć 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ę została wystrzelona iracka rakieta 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 był w stanie właściwie namierzyć rakiety Scud. Co ciekawe patch do oprogramowania został wypuszczony dzień po tragedii, czyli już wcześniej odkryto ten bug.

3. Ariane 5

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 nakładów na Ariane 5 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ą), natomiast szósta została dotkliwie poparzona. Śledztwo wykazało, że oprogramowanie  maszyny do radioterapii nowotworów Therac-25 zostało napisane w Asemblerze przez jednego tylko 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. W przypadku zbyt szybkiej zmiany trybu pracy urządzenia przez operatorów, pojawiał się bug nazywany często „wyścig” – wysyłane były dwie instrukcje i która pierwsza docierała do Therac-25, ta ustawiała odpowiedni tryb urządzenia. To sprawiało, że pacjenci często otrzymywali zbyt duże dawki promieniowania.

5. Mariner 1

Tym razem przywołujemy błąd nazywany często „najdroższym myślnikiem w historii”. O co chodzi? Sprawa dotyczyła rakiety, mającej za zadanie 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ć niewłaściwej trajektorii jej 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 było 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 zmiany prędkości rakiety, który były minimalne, zostały zinterpretowane jako duże i wyłączyły się procedury korekty lotu.

6. Mars Climate Orbiter

Pozostajemy przy wpadkach NASA, ale tym razem przenosimy się do 1999 roku. 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. Znowu problemem okazało się oprogramowanie. Poszczególne części software’u były kodowane w różnych krajach, a 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ę.

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ż w jednym z naszych artykułów.