8 najgorszych w skutkach pomyłek programistów

Wielkie systemy informatyczne, skomplikowane aplikacje, bardzo drogi sprzęt, są tworzone przez ludzi. A ludzie są omylni. W historii technologii znajdujemy wiele przykładów na to, że banalny, przez nikogo niezauważony błąd programisty prowadzi do awarii, wypadku lub wielkiej tragedii. Przejrzeliśmy archiwa i znaleźliśmy najgroźniejsze pomyłki programistów. Niektóre mrożą krew w żyłach.
Samolot Malaysia Airlines, najprawdopodobniej zestrzelony, rozbił się niedaleko granicy z Rosją. Na pokładzie
samolotu było 298 osób; nikt nie przeżył. W rejonie, gdzie spadł malezyjski samolot, trwają walki między prorosyjskimi separatystami a ukraińskimi siłami rządowymi. Samolot leciał z Amsterdamu do Kuala Lumpur. 50 kilometrów przed wejściem w rosyjską przestrzeń powietrzną zaczął się zniżać. Uderzył w ziemię w okolicach miast
Szachtarsk i Torez w obwodzie donieckim na wschodzie Ukrainy. Na zdjęciu: uzbrojony separatysta na miejscu katastrofy samolotu. Zapraszamy do galerii zdjęć tygodnia Samolot Malaysia Airlines, najprawdopodobniej zestrzelony, rozbił się niedaleko granicy z Rosją. Na pokładzie samolotu było 298 osób; nikt nie przeżył. W rejonie, gdzie spadł malezyjski samolot, trwają walki między prorosyjskimi separatystami a ukraińskimi siłami rządowymi. Samolot leciał z Amsterdamu do Kuala Lumpur. 50 kilometrów przed wejściem w rosyjską przestrzeń powietrzną zaczął się zniżać. Uderzył w ziemię w okolicach miast Szachtarsk i Torez w obwodzie donieckim na wschodzie Ukrainy. Na zdjęciu: uzbrojony separatysta na miejscu katastrofy samolotu. Zapraszamy do galerii zdjęć tygodnia REUTERS/MAXIM ZMEYEV

Śmiertelnie niedopracowana broń

Latem zeszłego roku świat współczuł ofiarom i rodzinom tragedii lotu Malaysia Airlines 17. Samolot celowo zestrzelono przez prorosyjskich separatystów za pomocą rosyjskiego sprzętu i z udziałem rosyjskich wojskowych. Nie był jedynym w historii cywilnym statkiem powietrznym strąconym w wyniku działań wojennych.

W lipcu 1988 roku amerykański krążownik USS Vincennes zestrzelił cywilny lot 655 z Teheranu do Dubaju. Tragedia, która pochłonęła 290 osób była spowodowana w dużej mierze błędem programistów. A konkretnie twórców systemu odpowiedzialnego za interakcję z systemami identyfikacji samolotów.

System, który mieli do dyspozycji amerykańscy wojskowi miał w sobie śmiertelnie groźne niedopracowanie. Po pierwsze operator, który śledził na ekranie obiekty wykryte przez radar nie był w stanie ocenić precyzyjnie ich ruchu. Po kolejnym odświeżeniu ekranu porównywano współrzędne i dokonywano ręcznych obliczeń. Przez tę niedoskonałość systemu potraktowano cywilny samolot jak myśliwiec zbliżający się dużą prędkością do lotniskowca. Błędnie.

O wiele tragiczna w skutkach była jednak pomyłka związana z projektowaniem interfejsu odpowiedzialnego za identyfikację samolotu, która przebiegała w dwóch etapach.

Podczas pomiaru punkty reprezentujące cywilny lot 655 i irański F-14 były na ekranie radaru bardzo blisko siebie. Operator najpierw stwierdził, że do krążownika zbliża się samolot - reprezentowany przez jeden z punktów. Przy drugim pomiarze, który miał określić rodzaj samolotu, operator pomylił punkty. Wybrał ten, który reprezentował irański myśliwiec. Dalej historia potoczyła się już dramatycznie - wojskowi uznali, że atakuje ich wrogi samolot i zestrzelili go.

Tragedia lotu 655 stała się tematem wielu analiz. Najbardziej wyważoną ocenę podaje Wikipedia

W czasie swojego lotu irański samolot znajdował się w stałym kontakcie z wieloma służbami kontroli lotów w regionie, monitorowanymi przez Organizację Międzynarodowego Lotnictwa Cywilnego. Na kilka sekund przed odpaleniem rakiet z USS Vincennes piloci maszyny prowadzili rozmowy w języku angielskim z kontrolą lotów w Bandar-e Abbas. Zgodnie z oficjalnymi ustaleniami komisji Fogarty'ego, amerykański krążownik miał możliwość słuchania rozmów na częstotliwości cywilnej międzynarodowej, ale nie na częstotliwości, którą wykorzystywał komercyjny lot irański (bo jej nie znał). Według raportu Organizacji Międzynarodowego Lotnictwa Cywilnego (ICAO) Amerykanie siedmiokrotnie próbowali nawiązać kontakt radiowy z irańskim samolotem na częstotliwości wojskowej i trzykrotnie na cywilnych, za każdym razem wywołując "niezidentyfikowany samolot lecący z prędkością 350 węzłów". Czarna skrzynka irańskiego samolotu wykazała później, że piloci irańskiej maszyny słyszeli trzy ostatnie komunikaty, jednak omyłkowo odnieśli je do irańskiego samolotu Orion, który wcześniej operował w tym rejonie.
W maju 2003 pozarządowa organizacja Międzynarodowe Stowarzyszenie Studiów Strategicznych (ISSA) określiła umieszczenie okrętu wyposażonego w AEGIS w strefie lotów cywilnych jako "nieodpowiedzialne", a działanie kapitana amerykańskiej jednostki uznała za "agresywne".

Całkiem prawdopodobne, że gdyby amerykańscy wojskowi dysponowali lepiej zaprojektowanym systemem tragedii można by uniknąć.

Airbus A320 linii Air Inter Airbus A320 linii Air Inter Fot. Wikipedia

Zabójcze oprogramowanie autopilota

Kolejna tragedia związana z lotnictwem była również spowodowana w dużej mierze błędem podczas tworzenia oprogramowania.

20 stycznia 1992 roku samolot Air Inter z Lyonu do Strasburga rozbił się o wzgórze w pobliżu lotniska docelowego. 87 osób, w tym obaj piloci, zginęli. Cudem przeżyło dziewięć osób.

Istotną, choć nie jedyną, przyczyną tragedii było oprogramowanie autopilota. Podczas podchodzenia do lądowania wprowadzono do niego wartość określającą kąt pod jakim maszyna powinna schodzić. Powinien wynosić 3,3 stopnia i taką wartość wprowadził drugi pilot. Problem w tym, że przy pomocy tego samego instrumentu do autopilota wprowadzano też prędkość schodzenia (w stopach na minutę x1000). Pilot widział więc wartość 3,3, ale nie dostrzegł już mało czytelnego oznaczenia nad tą wartością. Nie zdawał sobie sprawy, że zamiast kąta schodzenia 3,3 stopnia ustalił prędkość 3300 stóp na minutę. To cztery razy za szybko. Zbyt duża prędkość schodzenia była główną przyczyną katastrofy polskiego samolotu pod Smoleńskiem.

Feralny instrument przyczyną tragedii

Fot. za lessonslearned.faa.gov

 

Piloci nie zdążyli zareagować. Na skutek dodatkowych czynników - rozmów z kontrolą lotu i olbrzymiego zdenerwowania - nie zauważyli na czas dramatycznie szybkiego tracenia wysokości.

Jak widać na poniższym zdjęciu zauważenie różnicy w oznaczeniu jednostek było w praktyce niezwykle trudne, wręcz niemożliwe.

Autopilot niedoskonale wskazywał jednostki

Fot. za lessonslearned.faa.gov

Therac 25 Therac 25 Fot. YouTube

Poparzeni przez błąd w kodzie

W latach osiemdziesiątych doszło do serii nieszczęśliwych wypadków związanych z maszynami służącymi do naświetleń. W oprogramowaniu Therac-25 czaił się niezwykle niebezpieczny błąd. Polegał on na tym, że maszyna informowała operatora o nieudanej próbie rozpoczęcia procesu naświetlania. Operator próbował więc przeprowadzić całą procedurę ponownie. W niektórych przypadkach wielokrotnie.

Jak wykazało późniejsze śledztwo Therac-25 dokonywały naświetleń pomimo komunikatu, iż procedura się nie rozpoczęła. W przypadkach trzech pacjentów doszło do śmiertelnego w skutkach napromieniowania lub zgonu przez przez źle leczoną chorobę nowotworową.  Kilka osób zostało poparzonych.

W raporcie firmy Wheel Systems czytamy, że przyczyną tragedii był trywialny błąd w kodzie. Kosztujący więcej niż milion dolarów automat był obsługiwany przez oprogramowanie napisane - według raportu Logical Trust - w assemblerze. Stworzyła je jedna osoba, która przeoczyła kluczowy fragment kodu. Troje ludzi straciło życie przez brak kilkudziesięciu znaków. Winą za problemy z Therac-25 można też obarczać osoby odpowiedzialne za testowanie maszyny przed wprowadzeniem na rynek.

Jak wyjaśnia Wikipedia "główną przyczyną nieprawidłowego funkcjonowania urządzeń był błąd typu race condition, na skutek którego w pewnych trudnych do odtworzenia warunkach (przy odpowiednio szybkiej pracy biegłego operatora), nie dochodziło do prawidłowej inicjalizacji wszystkich parametrów zabiegu. Problem ten miałby jednak dużo mniej tragiczne konsekwencje, gdyby w ramach redukcji kosztów nie zrezygnowano z mechanicznych zabezpieczeń stosowanych wcześniej w maszynach Therac-6 i Therac-20. Dodatkowo, liczba ofiar mogłaby być znacznie niższa, gdyby producent maszyny nie bagatelizował kolejnych powiadomień o nieprawidłowościach i wypadkach."

Szczegółową analizę błędu można znaleźć tutaj.

Kod, który zabijał?

Fot. Nancy Levson

Błędnie obliczona sekunda przyczyną śmierci 28 osób

W 1991 roku, podczas wojny w Zatoce Perskiej, doszło do tragicznej pomyłki, na skutek której zginęło 28 osób, a 100 odniosło rany. Wszystko za sprawą oprogramowania odpowiedzialnego działanie systemu Patriot.

Niedokładność kodu sprawiła, że po stu godzinach nieustanej pracy drobna pomyłka w pomiarze czasu urosła do gigantycznej wartości. Różnica pomiędzy czasem mierzonym przez system, a czasem rzeczywistym wyniosła 0,34 sekundy.

To wystarczyło, by spowodować eksplozję rakiety w nieodpowiednim miejscu. Nie zdążyła zestrzelić wrogiej rakiety - w konsekwencji czego ta trafiła w baraki amerykańskiej armii zabijając 28 osób i raniąc sto.

Do wyliczenia następnej pozycji wrogiej rakiety używany był czas pracy urządzenia w sekundach. Był ustalany przez licznik, którego wartość zwiększała się co 0,1s. Patriot posiadał jednak 24 bitową jednostkę liczb zmiennoprzecinkowych. Zamiast wartości 0,1 system w rzeczywistości stosował do obliczeń wartość 0,099999905. Po stu godzinach pracy przyniosło to gigantyczną różnicę. Najdziwniejsze w całej sprawie jest to, że twórcy oprogramowania wychwycili tę wadę. Nie poinformowali jednak wojskowych, że konsekwencją będzie błędne sterowanie rakiety.

Zadaniem systemu Patriot jest przewidzenie gdzie rakieta Scud pojawi się za chwilę. Pozycja jest wyliczana w oparciu o znaną prędkość i czas ostatniej lokalizacji rakiety na radarze. Prędkość jest liczbą rzeczywistą, np. 3759.2563 mil na godzinę, a czas pobierany z zewnętrznego zegara urządzenia z dokładnością co do dziesiątych sekundy i zapisywany jako liczba całkowita (32, 33, 34). Im dłużej system działa, tym większe są wartości identyfikujące czas (2035, 2036, ?). Aby ocenić przewidywane położenie rakiety Scud, zarówno prędkość jak i czas muszą być wyrażone jako liczby rzeczywiste. Niestety konwersja liczb jest ograniczona przez 24 bitowe rejestry systemu Patriot i tylko z taką precyzją jest w stanie zapisać liczbę. Brak precyzji w obliczeniach jest więc wprost proporcjonalny do czasu działania systemu i prędkości rakiety. - czytamy w cytowanym przez Niebezpiecznik.pl raporcie General Accounting Office.

Bolesne skutki

Trzy kolejne przypadki błędów w programowaniu nie pochłonęły ofiar, za to całą masę pieniędzy i mnóstwo czasu.

Do pierwszego zdarzenia doszło w 1996 roku. Rakiety Ariane 5, zbudowana przez Europejską Agencję Kosmiczną, eksplodowała zaledwie kilkadziesiąt sekund po starcie.

W wyniku śledztwa ustalono, że przyczyną awarii było użycie kodu skopiowanego z oprogramowania sterującego poprzednią wersją rakiety - Ariane 4. W trakcie lotu jedna z funkcji pochodzących z Ariane 4, zgłosiła błąd. Jego interpretacja wprowadziła z kolei w błąd wewnętrzny system nawigacji rakiety, doprowadzając tym samym do wydania przez główny komputer polecenia wykonania nagłego zwrotu o 20 stopni. W tym wypadku nie pomógł nawet awaryjny system, ponieważ kiedy główny komputer, w wyniku błędu, wyłączył się, zapasowy obwód, który powinien przejąć jego zadania, też już nie działał.

Podobne zaniedbania kosztowały NASA 700 milionów dolarów. Podczas wchodzenia w atmosferę Marsa sondy Mars Climate Orbiter nieprawidłowo zadziałały dopalacze lądownika. Przyczyna była - można by rzec - banalna. Za część kodu sterującą pracą dopalaczy odpowiadali Brytyjczycy. Posługując się innymi niż Amerykanie jednostkami metrycznymi sprawili, że sonda spłonęła w atmosferze Marsa. Zamiast wchodzić w nią na wysokości ok. 150km obniżył się aż do 50km.

Identyczny błąd sprawił spore problemy podczas projektowania Boeinga 787 Dreamliner. Nad samolotem pracowały dwa zespoły - amerykański i brytyjski. Europejczycy "zapomnieli" o innym systemie miar. Spora część samolotu musiała więc zostać przeprojektowana.

Wystarczy spojrzeć na tę witrynę opisującą sposób projektowania Dreamlinera, by przekonać się, że przy tak wielkiej operacji nietrudno o pomyłkę.

Seksistowski błąd systemu

Ciekawy błąd spowodowany błędem w programowaniu omówił Niebezpiecznik.pl. Serwis opisuje historię kobiety, która chciała skorzystać z siłowni. Niestety problemy pojawiły się już przy wejściu do szatni. Drzwi zabezpieczał zamek szyfrowy, jednak pomimo wpisywania prawidłowego kodu nie pozwalał wejść.

Krótki śledztwo wykazało, że programiści tworzący system odpowiedzialny za obsługę drzwi dokonali "seksistowskiej" pomyłki. Kobieta nie mogła wejść, bo oprogramowanie przypisało ją do... męskiej szatni. Dlaczego? Bo posiadała tytuł naukowy. Oprogramowanie przyjmowało z góry, że wszyscy doktorzy to mężczyźni. System "przydzielił" więc panią doktor do męskiej szatni, a ta próbowała otworzyć drzwi do damskiej.