Programista jest tylko człowiekiem, czyli skąd się biorą błędy w oprogramowaniu


Skąd się biorą błędy w oprogramowaniu. Zagrożenie życia

Wymienione przykłady błędów w oprogramowaniu powodowały jedynie straty finansowe. Niestety były i takie, które prowadziły do utraty zdrowia i życia. 14 sierpnia 2003 roku miała miejsce największa awaria zasilania w historii świata. W USA i w Kanadzie odciętych wówczas od prądu zostało ponad 50 mln ludzi. Zasilania pozbawione zostały stany Ohio, Nowy Jork, New England, Massachusetts, Connecticut, Michigan, Pensylwania oraz północne New Jersey. W Kanadzie zaś prowincje Quebec i Ontario. Podczas awarii wyłączonych zostało 100 elektrowni, w tym 22 atomowe. Skutki były porażające – zawieszono loty, przestały kursować pociągi, stanęły windy a ulice zostały zakorkowane z powodu braku sygnalizacji świetlnej. Awaria zasilania przyczyniła się do śmierci co najmniej 11 osób.

Jedną z głównych przyczyn awarii był błąd w oprogramowaniu sterującym siecią energetyczną. W aplikacji doszło do tzw. sytuacji wyścigu (ang. race condition). Ma ona miejsce wówczas, gdy wiele procesów wykonuje operacje na tych samych danych, a rezultat tych operacji jest ściśle zależny od kolejności, w jakiej procesy zostały wykonane. Blackout z 2003 r. zaczął się od błędu wynikającego ze złej kolejności wykonania operacji, co doprowadziło do omyłkowego wyłączenia jednej stacji transformatorowej i w efekcie – przeciążenia sieci energetycznej i kolejnych awaryjnych wyłączeń podstacji energetycznych i elektrowni.

Z błędem w oprogramowaniu związanym z sytuacją wyścigu powiązane było inne zdarzenie, które skończyło się śmiercią pacjentów. W latach 1985-1987 sześć osób uległo poparzeniu w wyniku naświetlań maszyną do radioterapii Therac-25. Trzy z nich w następstwie wypadku zmarły na chorobę popromienną. W trakcie pierwszego nieszczęśliwego zdarzenia, w wyniku którego pacjentka straciła pierś i czucie w ręce automat zaaplikował ok. 100 razy większą dawkę promieniowania niż powinien. Producent maszyny Therac-25, firma AECL, uznał jednak, że taki wypadek nie jest możliwy i nie podjął żadnych działań. Jeszcze w tym samym, 1985 roku, inna maszyna uległa awarii, wyświetlając komunikat o błędzie i niepodjęciu naświetlania. Ponieważ podobne zdarzenia miały już miejsce wcześniej, operator chciał ręcznie wymusić wykonanie procedury naświetlania. Nie udało mu się to, a maszyna jeszcze pięć razy wyświetliła mu komunikat o błędzie, po czym całkowicie odmówiła posłuszeństwa. Trzy miesiące później pacjent, który teoretycznie nie został w ogóle naświetlony, zmarł w związku z powikłaniami, których przyczyną było napromieniowanie.

Programista jest tylko człowiekiem, czyli skąd się biorą błędy w oprogramowaniu

W latach 1985-1987 sześć osób uległo poparzeniu w wyniku błędu w oprogramowaniu sterującym maszyną do radioterapii Therac-25. [licencja: public domain]

Firma AECL bardzo długo zaprzeczała, że istnieje możliwość, aby Therac-25 mylił dawki promieniowania i wykonywał naświetlanie pomimo wyświetlania przeczących temu komunikatów. Do 1987 roku poparzeniom uległo jeszcze czterech pacjentów i sprawa trafiła do sądu. W trakcie postępowania AECL przyznał, że przed wprowadzeniem wartej ponad milion dolarów maszyny do sprzedaży wykonano jedynie kilka testów urządzenia. Okazało się też, że napisane w assemblerze oprogramowanie, stworzone zostało przez jedną osobę, a wypadki spowodowane były małym błędem programisty – zabrakło jednego liczącego kilkadziesiąt znaków wiersza kodu, który zapobiegałby sytuacji wyścigu. Istotne jest tutaj też to, że błąd ten bez problemu zostałby wychwycony, gdyby przed wprowadzeniem maszyny do radioterapii na rynek prawidłowo ją przetestowano.