wojem niezawodnego oprogramowania

Transkrypt

wojem niezawodnego oprogramowania
Nr wniosku: 166199, nr raportu: 17696. Kierownik (z rap.): prof. dr hab. Witold Charatonik
Celem naszego projektu było rozwiązanie ważnych problemów teoretycznych związanych z rozwojem niezawodnego oprogramowania. Oprogramowanie otacza nas ze wszystkich stron i jest
go coraz więcej, coraz częściej spotykamy się z błędami w jego działaniu. Skutki takich błędów
mogą być właściwie dowolne, od irytacji użytkownika po prawdziwe katastrofy. Jeśli np. musimy uruchomić ponownie odbiornik GPS podczas jazdy samochodem po obcym mieście, jest
to nie tylko irytujące ale także potencjalnie niebezpieczne. Jeśli stacja przekaźnikowa telefonii
komórkowej przestanie nagle działać, może to być nie tylko kosztowne dla operatora, ale także
niebezpieczne ze względu na niemożliwość wezwania służb ratowniczych w nagłych wypadkach.
Głównymi sposobami uzyskiwania niezawodnego oprogramowania są inspekcje kodu oraz dokładne testowanie. Jednak współczesne oprogramowanie jest tak złożone i używane w tak różnorodny sposób, że nie da się przewidzieć i przetestować wszystkich możliwych sytuacji, w których
będzie ono użyte. Dlatego powstaje tu silna potrzeba nowych technik zapewniających niezawodność. W naszym projekcie zajmowaliśmy się technikami opartymi na logikach i systemach
dowodowych ułatwiających tworzenie niezawodnego oprogramowania.
Jednym z ważnych aspektów oprogramowania jest zarządzanie pamięcią. Każdy kawałek programu rezerwuje podczas uruchomienia pewien obszar pamięci i zwraca tę pamięć gdy kończy
obliczenia. Jest to źródłem wielu potencjalnych problemów. Pewne obszary pamięci mogą być
zarezerwowane i zmodyfikowane dwukrotnie przez różne części programu; inny kawałek programu
może zapomnieć zwrócić zarezerwowaną pamięć po zakończeniu działania. W pierwszym przypadku oba kawałki programu będą działać niepoprawnie. W drugim przypadku program zajmie
całą dostępną pamięć i zatrzyma się, a użytkownik będzie musiał go wyłączyć i uruchomić ponownie.
Nasze metody polegają na dowodzeniu poprawności programu lub jego części przez udowodnienie prawdziwości odpowiedniej formuły logicznej modelującej dany program. Jednak w ogólnym przypadku szukanie dowodów takich formuł jest bardzo trudne, nawet dla komputera. Wynika to np. z faktu, że w formułach można zakodować całą współczesną matematykę. Dlatego
musieliśmy szukać kompromisu: nasze logiki muszą być na tyle silne, żeby mogły wyrazić istotne
własności oprogramowania (jak np. pytania dotyczące zarządzania pamięcią) i na tyle słabe,
żeby komputery mogły sobie z nimi poradzić. Formalnie, zajmowaliśmy się rozszerzeniami logiki
z dwiema zmiennymi. Dla całej gamy takich logik badaliśmy ich złożoność (czyli jak trudno jest
komputerowi udowodnić prawdziwość formuły takiej logiki) i siłę wyrazu (jak zakodować w logice
pytania dotyczące np. zarządzania pamięcią w programach).
Innym ważnym aspektem współczesnego oprogramowania są błędy wykonania. Takie błędy
trudno opisuje się w standardowych logikach, które zostały zaprojektowane do modelowania matematyki, gdzie tego typu błędy rzadko występują. Przykładem tego typu błędu w matematyce
jest dzielenie przez zero czy próba obliczenia logarytmu ujemnej liczby. W programach takich
błędów jest dużo więcej: przy rezerwowaniu pamięci (bo może być przepełniona), przy odczytywaniu danych (bo dane mogą być w złym formacie), przy szukaniu danych (bo dane mogą
być przestarzałe) itp., itd. W drugiej części naszego projektu rozwijaliśmy logiki z funkcjami,
które mogą modelować tego typu błędy. Takie funkcje nazywamy funkcjami częściowymi. Opracowaliśmy logiki dla funkcji częściowych i systemy dowodowe dla tych logik, a także strategie
automatycznego wyszukiwania dowodów w tych systemach.
Mamy nadzieję, że nasze badania przyczynią się do powstania nowych, opartych na logice,
technik tworzenia bardziej niezawodnego oprogramowania.

Podobne dokumenty