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.

Więcej o:
Komentarze (70)
8 najgorszych w skutkach pomyłek programistów
Zaloguj się
  • jestem-tu

    Oceniono 31 razy 27

    Airbus wprowadził kiedyś zabezpieczenia przed pomyłką pilota, aby uniemożliwić włączenie odwracacza ciągu jeszcze w powietrzu przed wylądowaniem. Odwracacz ciągu był zablokowany jeśli nie kręciły się koła podwozia, co znaczyło że samolot jeszcze leci. Kiedyś w Warszawie po gwałtownej ulewie pas był pokryty wodą i koła miały poślizg i się nie obracały, odwracacz ciągu nie zadziałał i samolot wjechał w mały nasyp za końcem pasa. Zginął pilot Lufthansy.
    Słyszałem o awaryjnym lądowaniu na młody las. W takiej sytuacji lepiej lądować na brzuchu ze schowanym podwoziem. Ale jak podwozie schowane, to znaczyło że samolot nie ląduje i zablokowane było wysunięcie klap i zmniejszenie prędkości.

  • tmave_pivo

    Oceniono 164 razy 144

    Nie dotrwałem do końca artykułu niestety, z dwóch powodów:
    Po pierwsze, teza artykułu jest taka, że te tragedie wywołane były błędami PROGRAMISTÓW. Czyli błędami w kodzie programu. Tymczasem całkiem sporo z tych przykładów pokazuje, że system albo nie był odpowiednio zaprojektowany (wskazówka: nie robią tego programiści), albo jego użytkownicy nie posiadali wystarczającej wiedzy o tym, jak powinni go używać (ponownie: za instrukcje użycia i szkolenie użytkowników końcowych programiści nie odpowiadają), albo wreszcie że błędy wynikały z ograniczeń technologii (i tu także nie można winić programistów).

    Naprawdę to programista odpowiada za czytelność wyświetlacza w kokpicie samolotu, albo za to, jakie funkcje oferuje system radarowy?

    Po drugie zaś: mam ograniczoną ilość błędów w tekście, które jestem w stanie znieść na raz, i bufor ten niestety wyczerał się w połowie czwartego przykładu.

    Ten tekst to jedna wielka "pomyła" (myślałem, że literówka, ale żeby dwa razy?)

    A tak na koniec:
    Tanio, szybko, dobrze. Wybierz dwa z trzech.

  • miszogun

    Oceniono 80 razy 74

    Panie Reduktor, system metryczny jest tylko jeden, nie ma innego systemu metrycznego. Jest inny system miar, a nawet kilka takich systemów. Kiedy się Pan Reduktor bierze za pisanie o nauce czy technice warto by było zaczaić różnicę.

  • gonzo44

    Oceniono 61 razy 47

    hmm..."oprogramowanie napisane w assemblerze..." a pod spodem jako egzemplifikacja (?) fragment kodu: "repeat..call..if..until..return" itd... no tak - "assembler" to takie mądre słowo, fajnie brzmi nie?

  • pol_icek

    Oceniono 42 razy 34

    W opisie slajdu 3-go jest stwierdzenie ze oprogramowanie bylo napisane w assemblerze ale juz przykladowy kod pod spodem assemblerem nie jest.

  • speedy13

    Oceniono 20 razy 18

    Część 4 - o błędzie oprogramowania systemu Patriot - napisana jest strasznie mętnie. Tekst sformułowany jest tak, jakby to sama rakieta Patriot wyrwała się spod kontroli i uderzyła w jakieś baraki:

    "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. Trafiła w baraki amerykańskiej armii zabijając 28 osób i raniąc sto."

    W rzeczywistości zaś na budynki bazy wojskowej w Dahranie w Arabii Saud. spadła iracka rakieta SCUD i to ona zabiła i raniła tyle osób. A spadła dlatego, że wskutek wspomnianego błędu oprogramowania system przeciwlotniczy Patriot nie zdołał jej przechwycić.

    Nie jest też do końca prawdą, że wojsko nie wiedziało o błędzie pomiaru czasu. Nie zdawano sobie tylko sprawy z jego rozmiarów. I zakładano że nie jest to bardzo ważny problem. Patriot to broń wojny manewrowej, mobilny system do osłony przemieszczających się zgrupowań wojsk. Zakładano, że w czasie działań wojennych baterie będą często zmieniać stanowisko, by uniknąć namierzenia i zniszczenia i nigdy nie będą pozostawać w jednym miejscu dłużej niż kilka godzin. A przemieszczenie wiązało się z wyłączeniem i ponownym włączeniem systemu, co niwelowało błąd czasu. Tymczasem w wojnie 1991 roku baterie Patriot wykorzystano do obrony obiektów stałych: miast, baz wojskowych, lotnisk itp. i nieraz pracowały one znacznie dłużej (wspomniana bateria w Dahranie ponad 100 godzin) przez co błąd czasowy narastał i narastał. Po informacjach od izraelskich specjalistów Amerykanie docenili wreszcie rozmiary błędu i wypuścili zaktualizowane oprogramowenie do systemu Patriot zawierające odpowiedną poprawkę. Było ono rozsyłane kolejno do wszystkich jednostek, ale do bazy w Dahranie dotarło dopiero dzień po tym fatalnym zdarzeniu.

  • sunday

    Oceniono 21 razy 17

    "Jednostka liczb zmiennoprzecinkowych"... Aż hadko czytać, panie Kedzierski. Nie wstyd panu pisać na tematy, na których pan się nie zna?

    P.S. Pana zdaniem CPU to "centralna jednostka procesująca"?
    P.S.2. W sumie nie jest źle. W końcu "floating point" mógł pan przetłumaczyć jako "latający punkt".

  • partia_niewidzialnych

    Oceniono 26 razy 16

    "Samolot celowo zestrzelono przez prorosyjskich separatystów "

    Dżizas, człowieku, doucz się.

  • thc4fun

    Oceniono 15 razy 13

    Idiotyczny artykul, w wiekszosci nie jest wina programistów... Ale ostatni przypadek to gratulacje, jeżeli jedną z największych spektakularnych wpadek to pomylka na silowni...

Aby ocenić zaloguj się lub zarejestrujX