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.