Błędy w oprogramowaniu dosięgają nas każdego dnia w postaci rebootujących się telefonów, zawieszających się komputerów, czy programów niespodziewanie kończących swoje działanie. Przyjrzymy się błędom, które miały znacznie gorsze konsekwencje, powodując ogromne straty finansowe lub, w skrajnych przypadkach, śmierć użytkowników. Postaramy się przeanalizować wybrane przypadki, aby nauczyć się na błędach innych, jak pisać kod, który działa.
4. ∀P∃x : P (x) = crash
Prawo Murphy’ego: w każdym programie (dłuższym niż 100 linijek)
jest jeszcze jeden błąd.
Chcemy nauczyć się na błędach innych jak zminimalizować ryzyko
prawdziwości powyższego ”prawa” dla naszych programów.
12. Dziś...
Błędy są wszędzie:
...bo oprogramowanie jest wszędzie?
...trend się raczej nie będzie zmniejszał...
...co nas czeka?
Prawo Murphy’ego: Gdyby budowniczowie budowali swoje budynki,
tak jak programiści piszą swoje programy, to pojawienie się pierwszego
dzięcioła doprowadziłoby do upadku cywilizacji.
14. A może to już dziś?
Źródło: http://wikipedia.org
15. Therac-25
od 1985 r. do 1987 r. 6 przypadków poparzenia pacjentów
3 pacjentów zmarło w następstwie wypadku
16. Therac-25
od 1985 r. na rynku
koszt produkcji 1 mln USD
stworzony przez AECL (Atomic Energy of Canada Limited,
Kanada) oraz CSR (Francja)
PDP-11 + terminal
sprzęt następnej generacji (Therac-6, Therac-20)
dwa tryby pracy: X-Ray oraz Electron
moc 25 MeV
jeden programista
oprogramowanie napisane w assemblerze
18. Therac-25 - incydent I
czerwiec 1985 r., Marietta, GA, USA
pacjentka po zabiegu informuje operatora o oparzeniu
szpital szacuje, że zaaplikowano ok. 100 razy mocniejszą dawkę
AECL twierdzi, że to niemożliwe i nie podejmuje dalszych kroków
pacjentka traci pierś oraz czucie w ręce
19. Therac-25 - incydent II
lipiec 1985 r., Ontario, Kanada
podczas zabiegu maszyna zatrzymuje się z błędem ”H-tilt”
maszyna zgłasza, że nie wykonano zabiegu
operator wciska magiczny klawisz P kontynuacji leczenia
po piątej próbie maszyna zatrzymuje się i wymaga restartu
pacjent zgłasza pieczenie w udzie
wezwany technik nie jest w stanie zdiagnozować co się stało
pacjent umiera trzy miesiące później w wyniku nowotworu
AECL naprawia jakieś błędy - nie mając pojęcia co się wydarzyło
AECL wysyła informacje do czterech klientów, żeby przerywać
leczenie jeżeli pojawi się błąd ”H-tilt”
20. Therac-25 - incydent III
styczeń 1986 r., Yakima, WA, USA
pacjentka zgłasza dolegliwość uda, na skórze pojawiają się zmiany
lekarze decydują się na kontynuację leczenia
rok później lekarze orientują się, że pacjentka otrzymała za dużą
dawkę
AECL twierdzi, że to niemożliwe oraz, że nie było podobnych
przypadków
pacjentka została zoperowana i ma się dobrze (podobno do
dziś...)
21. Therac-25 - incydent IV
marzec 1986 r., Tyler, TX, USA
operator myli się i wprowadza opcję X-Ray zamiast Electron
szybko koryguje błąd
maszyna przerywa zabieg z komunikatem Malfunction 54
operator był przyzwyczajony do dziwnych zachowań maszyny,
ponieważ na ekranie pojawia się informacja o niskiej dawce
kontynuuje leczenie przyciskiem P
maszyna ponownie informuje o błędzie
aparatura audio-video monitorująca pokój zabiegowy jest
niesprawna, operator nie widzi cierpienia pacjenta
po drugiej dawce pacjent uderza w drzwi, operator przerywa
zabieg
pacjent traci czucie w nogach i rękach, ledwo może mówić
AECL twierdzi, że pacjent został porażony prądem przez złe
podłączenie maszyny
niezależna firma nie potwierdza oskarżeń AECL
22. Therac-25 - incydent V
kwiecień 1986 r., Tyler, TX, USA
operator myli się i wprowadza opcję X-Ray zamiast Electron
szybko koryguje błąd
maszyna przerywa zabieg z komunikatem Malfunction 54
operator kontynuuje zabieg przyciskiem P
operator słyszy krzyk pacjenta
operator przerywa leczenie
pracownicy szpitala w wyniku śledztwa ustalają tragiczną
sekwencję
FDA orientuje się, że Therac-25 ma defekty i wymusza na AECL
korekcję
23. AECL wprowadza poprawki
nie wprowadzono zabezpieczeń sprzętowych
wyłączono możliwość wznowienia leczenia przyciskiem P
poprawiono komunikaty błędów
FDA wymusza zmiany w procesie wytwarzania oprogramowania
przez AECL
QA manager z AECL przyznaje, że:
wykonali ”małą liczbę” testów oprogramowania
później przyznał, że testami było 2700 godzin pracy urządzenia...
FDA zmusza AECL do dokładnych testów
24. Therac-25 - incydent VI
styczeń 1987 r., Yakima, WA, USA
incydent wydarzył się przed wdrożeniem poprawek AECL
operator ustawia dawkę
maszyna wyświetla błąd, operator kontynuuje leczenie
maszyna twierdzi, że pacjent otrzymał dawkę ”7 rad”
pacjent skarży się na poparzenie
pacjent umiera trzy miesiące później w następstwie incydentu
25. Therac-25 - race condition
Źródło: Medical Devices: The Therac-25 - Nancy Leveson, University of Washington
26. Therac-25 - integer overflow
Źródło: Medical Devices: The Therac-25 - Nancy Leveson, University of Washington
27. Therac-25 - co zrobiono źle?
błędy w projekcie
brak formalnych wymagań i testów
decyzja o usunięciu sprzętowych zabezpieczeń
błędy w dokumentacji
brak szczegółów dot. błędów
brak opisu sytuacji awaryjnych
błędy w oprogramowaniu
operatorzy uodpornili się na sytuacje krytyczne
programowanie wielowątkowe jest trudne
brak testów
błędy w reagowaniu na incydenty
ignorowanie błędów zgłaszanych przez użytkowników
ignorowanie incydentów
28. Patriot
25 lutego 1991 r. podczas wojny w Zatoce Perskiej nie zestrzelił
irackiej rakiety scud
Rakieta uderza w amerykańskie baraki zabijając 28 osób i raniąc
ponad 100
29. Patriot
system powstał w latach 70. do operacji w Europie przeciwko
rakietom, którymi dysponował ZSSR
typowe dla ZSSR rakiety osiągały prędkość 2 MACH
sprzęt z lat 70. - ograniczona precyzja wykonywania operacji
zmiennoprzecinkowych
aktualizacja oprogramowania trwa ok. 1-2 godziny
restart urządzenia trwał ok. 60-90 sekund
sprzęt przeznaczony do krótkiego operowania (do 8 godzin) i
przewożenia w następne miejsce
system wsławił się pierwszym aktywnym zwalczaniem rakiet
balistycznych wroga...
...rakiet widmo
30. Patriot - Jak działa?
Źródło: GAO/IMTEC-92-26 Patriot Missle Software Problem
31. Patriot - Incydent
25 lutego 1991 r., Dhahran, Arabia Saudyjska - wojna w Zatoce
Perskiej
Baza lotnicza w Dhahran chroniona jest przez 6 instalacji
systemu Patriot
Irackie Scudy osiągają prędkość 5 MACH
System Patriot działał bez restartu ponad 100 godzin
Jedna z rakiet trafia w amerykańskie baraki zabijając żołnierzy
Kilka tygodni wcześniej Izrael (jeden z użytkowników systemu)
donosi o nieprawidłowościach
Poprawione oprogramowanie pojawia się w bazie w Dhahran
dzień po incydencie...
32. Patriot - Błąd
do wyliczenia następnej pozycji wrogiej rakiety używany był czas
pracy urządzenia w sekundach
czas pracy wyliczany był przez inkrementowany co 0.1s licznik
...aby otrzymać liczbę sekund od włączenia urządzenia mnożono
licznik przez liczbę 0.1
Patriot miał 24 bitową jednostkę liczb zmiennoprzecinkowych
dec (0.1) = bin (0.00011001100 (1100))
W rejestrze urządzenia pojawiała się wartość ok. 0.099999905
35. Patriot - Co zrobiono źle?
poinformowano użytkowników systemu, że może działać źle przy
długim czasie pracy, ale nie wskazano konsekwencji
nie wzięto pod uwagę nietypowego użycia systemu
urządzenia do logowania nie były użyte ze względu na
potencjalną destabilizację pracy, w którą wierzyli dowódcy
operacje na liczbach zmiennoprzecinkowych są trudne...
37. Ariane-5
Projekt Europejskiej Agencji Kosmicznej
budowa zajęła 10 lat i pochłonęła 7 miliardów dolarów
następca Ariane-4
oprogramowanie w języku ADA
szybsza, większa, lepsza od poprzedniczki...
39. Ariane-5 - krok po kroku...
system autodestrukcji niszczy rakietę w wyniku komendy zmiany
parametrów lotu o ponad 20 stopni
komputer pokładowy wydaje polecenie korekcji lotu o ponad 20
stopni
komputer pokładowy otrzymuje dziwne dane od wew. systemu
nawigacji
wew. system nawigacji wysyła błąd do komputera pokładowego
wew. system nawigacji nie może przełączyć się na zapasowy, bo
ten już nie działa
wew. system nawigacji zgłasza wyjątek - rzutowanie double na
short int poza zakresem (Operand Error)
40. Ariane-5 - wstydliwe fakty
programiści uważali, że nie będzie błędu konwersji...
funkcja, która zgłosiła błąd, była bezużyteczna podczas lotu
rakiety
...to pozostałość po Ariane-4, zbędna w Ariane-5...
41. Ariane-5 - Co zrobiono źle?
nie sprawdzono dokładnie założeń oprogramowania Ariane-4
nie przeprowadzono symulacji programowej
nie było systemu testów
błędy projektowe
42. Nasa - Mars Climate Orbiter
25 września 1999 r. NASA ogłasza niepowodzenie misji MCO
43. Nasa - Mars Climate Orbiter
Jedyne wykonane zdjęcie przez sondę... Źródło: NASA
44. NASA - Mars Climate Orbiter - incydent
po ok. 10 miesiącach sonda dociera do Marsa
23 września 1999 r.:
08:41 (UTC) - sonda zaczyna proces wejścia na orbitę
08:50 (UTC) - przygotowanie do włączenia głównego silnika
09:00 (UTC) - silnik sondy włączony
09:04 (UTC) - utrata łączności z sondą (Ziemia została
przysłonięta przez Marsa)
09:27 (UTC) - oczekiwane wznowienie łączności...
25 września 1999 r. - NASA ogłasza niepowodzenie misji
śledztwo wykazało, że sonda spaliła się w atmosferze Marsa
koszt misji szacowany jest na ok. 700 mln USD
45. NASA - Mars Climate Orbiter - błąd
Źródło: Xession, wikipedia.org
System przetwarzania instrukcji kontroli naziemnej używał innych jednostek niż reszta sondy.
46. NASA - Mars Climate Orbiter - co zrobiono źle?
zignorowano wątpliwości pracowników dot. lotu sondy
problemy komunikacyjne między zespołami
brak szczegółowych testów
47. Morris Worm
Robert Morris 2 listopada 1988 r. uwalnia pierwszego robaka
internetowego
pierwsza infekcja następuje ok. 20:00
3 listopada ok. 0:30 pierwszy administrator wykrywa podejrzany
proces w sytemie
dwie godziny później większość administratorów nie może
zalogować się do systemu
restart systemu nie pomagał
robak zainfekował ok. 10% komputerów w ówczesnym internecie
normalne funkcjonowanie sieci przywrócono 10 listopada 1988 r.
straty ok. 100 tys. - 10 mln USD
48. Morris Worm - błąd
wykorzystano błędy w rsh, sendmail oraz fingerd
błąd w fingerd polegał na użyciu funkcji gets(3)
Morris zaszył w robaku kod sprawdzający czy dana maszyna jest
już zainfekowana...
...ale raz na siedem razy (losowo) infekował komputer jeszcze raz
49. Robert Morris
przyznał się do napisania robaka
sąd skazał Morrisa na 10 tys. dolarów grzywny, 3 letni dozór
sądowy i 400 godzin prac społecznych
pierwsza osoba skazana na mocy Computer Fraud and Abuse Act
Morris dziś jest profesorem
zainspirował powstanie pierwszego zespołu CERT (CMU)
51. Ku przestrodze - Toyota
Źródło: Bookout vs. Toyota - Michael Barr
samochody same zaczynają przyśpieszać
ranni oraz zabici w wyniku błędu
strata: ok. 1,5 mld USD
52. Słowo na niedzielę...
kontrola podstawą zaufania
jeżeli coś może się wydarzyć, to na pewno się wydarzy (expect
unexpected)
wytwarzanie oprogramowania nie jest łatwe
co robić, jak żyć?