Specyfikacje w praktyce na przykładzie JML-a. Sesja I



Podobne dokumenty
Techniki zabezpieczania kodu - kontrola wyjatków. Temat VIII

Specyfikacje formalne

WERYFIKACJA WSPOMAGANA KOMPUTEROWO

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Rozszerzenia JML-a do weryfikacji programów wielowatkowych

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Dziedziczenie. dr Jarosław Skaruz

Programowanie kontraktowe w Javie

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Klasy abstrakcyjne, interfejsy i polimorfizm

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Dokumentacja do API Javy.

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Zdalne wywołanie metod - koncepcja. Oprogramowanie systemów równoległych i rozproszonych Wykład 7. Rodzaje obiektów. Odniesienie do obiektu

Języki i metody programowania Java. Wykład 2 (część 2)

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Java podstawy jęyka. Wykład 2. Klasy abstrakcyjne, Interfejsy, Klasy wewnętrzne, Anonimowe klasy wewnętrzne.

Programowanie obiektowe - 1.

Programowanie obiektowe

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Programowanie w Javie wykład 7 Klasy c.d. (przeciążanie metod, polimorfizm) Metody i klasy abstrakcyjne Bloki inicjalizacyjne

Programowanie obiektowe

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Oprogramowanie systemów równoległych i rozproszonych Wykład 7

Programowanie w Javie - wykład 3

Kompozycja i dziedziczenie klas

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Dziedziczenie. Tomasz Borzyszkowski

Enkapsulacja, dziedziczenie, polimorfizm

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Wstęp do Programowania 2

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

Aplikacje w Javie wykład 5 Klasy c.d. (przeciążanie metod, polimorfizm) Metody i klasy abstrakcyjne Interfejsy

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Język JAVA podstawy. Wykład 4, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Mechanizm dziedziczenia

Wykład 6: Dziedziczenie

Polimorfizm. dr Jarosław Skaruz

Programowanie obiektowe

Języki i techniki programowania Ćwiczenia 2

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Programowanie obiektowe

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

Współbieżność w środowisku Java

PHP 5 język obiektowy

METODY PROGRAMOWANIA

Kurs WWW. Paweł Rajba.

Związek między pojęciami Zasada podstawialności Podklasy muszą realizować kontrakt zawarty przez nadklasy

Formalna weryfikacja oprogramowania w lotnictwie

Programowanie w Internecie. Java

Co jeszcze mogą nam dać adnotacje? Adam Warski

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

Platformy Programistyczne Podstawy języka Java

JAVA- wykład 2 Klasy

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Programowanie obiektowe

Wykład 8: Obsługa Wyjątków

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Aplikacje w środowisku Java

Automaty do zadań specjalnych. Olga Maciaszek-Sharma, Artur Kotow Wersja 1,

Kompozycja i dziedziczenie klas

Programowanie obiektowe

Aplikacje w środowisku Java

Rozdział 4 KLASY, OBIEKTY, METODY

Pakiety i interfejsy. Tomasz Borzyszkowski

Programowanie obiektowe

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski

Programowanie obiektowe

Kurs programowania. Wykład 9. Wojciech Macyna

10. Programowanie obiektowe w PHP5

Obsługa błędów za pomocą wyjątków. Paweł Motofa (140746)

Throwable. Wyjatek_1(int x_) { x = x_; } int podaj_x()

Klasy cd. Struktury Interfejsy Wyjątki

dziedziczenie - po nazwie klasy wystąpią słowa: extends nazwa_superklasy

Techniki zabezpieczania kodu analiza przepływu informacji. Temat V

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Programowanie obiektowe

Technologie i usługi internetowe cz. 2

WYKORZYSTANIE JĘZYKA GROOVY W TESTACH JEDNOSTKOWYCH, INTEGRACYJNYCH I AUTOMATYCZNYCH. Mirosław Gołda, Programista Java

Języki Programowania II Wykład 3. Java podstawy. Przypomnienie

Klasy abstrakcyjne i interfejsy

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Słowa kluczowe jak góry lodowe

public - może być używana w kodzie poza klasą, jedna klasa ModyfikatorKlasy może być kombinacją wyrażeń:

Polimorfizm a klasy generyczne w języku Java. Zdzisław Spławski 1

Programowanie w środowisku graficznym- wykład 2 Java - Klasy

Mechanizm dziedziczenia

Systemy Rozproszone - Ćwiczenie 6

Język JAVA podstawy. wykład 2, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

Zaawansowane programowanie w C++ (PCP)

Transkrypt:

Specyfikacje w praktyce na przykładzie JML-a Sesja I

Co to jest JML? Java Modeling Language Język Modelowania Javy Język wyrażania własności programów logika pierwszego rzędu Składnia zrozumiała dla programistów "Design-by-contract" projekt na bazie kontraktu www.jmlspecs.org (2/37)

Co daje JML? Dokumentacja kodu Uproszczenie tworzenia programu przez abstrakcję Interfejs do rozmowy Rozwiazywanie konfliktów odpowiedzialności Rozwiazanie problemu niekompatybilności Sprawdzanie poprawności (3/37)

Co daje JML? dokumentacja Problem z javadoc nieaktualne JML dokładny w zakresie "co" JML aktualny Mniejsze kłopoty z utrzymywaniem kodu (4/37)

Co daje JML? abstrakcja Człowiek pracuje wydajnie w określonych ramach Za ciężkie zadanie da się wykonać, ale z błędami Specyfikacja wydzielenie części ciężaru Specyfikacja mówi "co", stara się nie mówić "jak" (5/37)

Co daje JML? interfejs, odpowiedzialność Zleceniodawca wykonania programu mówi "co" chce Zleceniobiorca po wykonaniu może powiedzieć: to jest moja realizacja "co" Zmniejszenie pola do oskarżeń/odwołań itp. Jasne jest, gdzie leży wina (6/37)

Co daje JML? kompatybilność Różne implementacje tej samej biblioteki Problemy ze zgodnościa co do podstawowej funkcjonalności Precyzyjny opis brak niezgodności (7/37)

Co daje JML? sprawdzanie Możemy oczekiwać od kodu oczekiwanej własności Zapewnienie, że ta własność zachodzi (8/37)

Co daje JML? sprawdzanie, narzędzia Kompilacja z asercjami sprawdzanymi w czasie wykonania jmlc (jmlrac) Przekształcanie specyfikacji w testy unitarne jmlunit Sprawdzanie statyczne specyfikacji ESC/Java2 Weryfikacja programów LOOP, JACK, KeY, Krakatoa Narzędzia wspomagajace Houdini, Daikon, Canapa, jmlspec (9/37)

Co to jest wada JML? Pracochłonność (ukryty koszt staje się jawny) (klienta nie obchodzi czy młotek ma równe krawędzie) Narzędzia trudne w obsłudze Często specyfikacja == implementacja W niektórych zastosowaniach nie do użycia (10/37)

Dodatkowe zadanie domowe Napisać specyfikacje w JML-u do wskazanej klasy MIDP Procedura: zgłosić się do mnie jak najszybciej Terminarz: do 20.01 wysłać specyfikacje do około 25.01 sprawdzone (na umowienie) Zysk: Zaliczenie pracy domowej => zaliczenie zadania z weryfikacji na egzaminie przy niezmienionym czasie trwania egzaminu (11/37)

JML warunki wejścia i wyjścia requires, ensures Można opisywać za pomoca wyrażeń warunki wejścia i wyjścia metod /*@ requires amount >= 0; @*/ ensures balance == \old(balance-amount) && \result == balance; public int debit(int amount) { }... (12/37)

JML warunki wejścia i wyjścia c.d. Specyfikacje w JML-u moga być dowolnie silne/słabe /*@ requires amount >= 0; ensures true; @*/ public int debit(int amount) {... } Domyślny warunek wyjścia true można opuścić. (13/37)

JML warunki wejścia i wyjścia c.d. Można specyfikować wiele par requires-ensures: /*@ requires amount >= 0; ensures true; also requires amount < 0 && webinterface; ensures true; @*/ public int debit(int amount) {... } Semantyka: metodę można wywołać bezkarnie, gdy dowolne z requires jest spełnione, jeśli dane requires jest spełnione na wejściu, to spełnione jest też odpowiednie ensures (14/37)

Wyjatki w specyfikacjach dwie formy Na poprzednich slajdach było domyślnie normal_behavior Uwaga na różnicę między 1. jeśli zachodzi P, to wyrzucone ma być SomeException 2. jeśli SomeException jest wyrzucone, to zachodzi P Łatwo te rzeczy pomylić Wyrażanie 1. za pomoca exceptional_behavior 2. za pomoca signals (15/37)

Wyjatki w specyfikacjach Przykład użycia exceptional_behavior /*@ exceptional_behavior requires amount > balance; signals (BankException e) e.getreason.equals("amount too big"); @*/ public int debit(int amount) {... } mówi, że BankException musi być wyrzucone, gdy amount > balance. (16/37)

Wyjatki w specyfikacjach signals Przykład użycia /*@ exceptional_behavior @*/ requires amount <= balance; signals (BankException e) e.getreason.equals("database error"); public int debit(int amount) {... } mówi, że BankException może być wyrzucone, gdy amount <= balance, ale powód jest "nielogiczny". (17/37)

Wyjatki w specyfikacjach implicite Domyślnie metoda może rzucać wyjatki, ale tylko te z klauzuli throws, zatem //@ requires 0 <= amount && amount <= balance; public int debit(int amount) throws BankException {... } ma implicite klauzulę: signals (BankException) true; oraz klauzulę: signals (Exception e) e instanceof BankException; (18/37)

Wyjatki w specyfikacjach implicite Domyślnie metoda może rzucać wyjatki, ale tylko te z klauzuli throws, zatem //@ requires 0 <= amount && amount <= balance; public int debit(int amount) {... } ma domyślnie klauzulę signals (Exception) false; Przy okazji debit nie może wyrzucić także nieraportowanego wyjatku, choć Java nie wymaga dla takich wyjatków raportu w throws (19/37)

Efekty uboczne assignable Własności ramek ograniczaja możliwe efekty uboczne metod: /*@ requires amount >= 0; assignable balance; ensures balance == \old(balance)-amount; @*/ public int debit(int amount) {... } To oznacza, że metoda debit może przypisywać tylko do pola balance. To nie wynika z warunku wyjścia Domyślna klauzula: assignable \everything (20/37)

Efekty uboczne pure Metoda bez efektów ubocznych jest określana jako pure public /*@ pure @*/ int getbalance(){...} Directory /*@ pure non_null @*/ getparent(){...} Metody pure maja domyślnie assignable \nothing. W specyfikacjach można używać (wyłacznie) metod pure, np.: /*@ invariant 0<=getBalance() && getbalance()<=max_balance; @*/ (21/37)

JML niezmienniki Niezmienniki klasowe, w odróżnieniu od niezmienników pętli Musza być utrzymywane przez wszystkie metody, np. public class Wallet { } public static final short MAX_BAL = 1000; private short balance; /*@ invariant 0 <= balance &&... @*/ balance <= MAX_BAL; Niezmienniki sa niejawnie dołaczane do wszystkich warunków wstępnych i warunków końcowych (22/37)

JML niezmienniki c.d. Niezmienniki musza być zachowywane także po wyrzuceniu wyjatku! Niezmienniki innych obiektów zakładane przed wejściem do metody (23/37)

JML niezmienniki c.d. Niezmienniki dokumentuja decyzje projektowe, np.: public class Directory { private File[] files; /*@ invariant files!= null && @*/ (\forall int i; 0 <= i && i < files.length; files[i]!= null && files[i].getparent() == this) Jawne zapisywanie niezmienników pomaga w zrozumieniu kodu. (24/37)

JML niezmienniki c.d. Rodzajem niezmiennika sa niezmienniki temporalne constraint Opisuja ewolucję stanu, np.: public class Gadgets { int counter = 0; /*@ constraint counter >= \old(counter); @*/ Semantyka: relacja między wartościami przed wywołaniem dowolnej metody i po jej wywołaniu (25/37)

Niezmienniki a pre- i post-warunki Niezmienniki i klauzule constraint generuja dodatkowe warunki końcowe dla każdej z metod public class A { int counter = 0; /*@ invariant Q; @*/ /*@ constraint P; @*/ void m() {... } (26/37)

Niezmienniki a pre- i post-warunki Niezmienniki i klauzule constraint generuja dodatkowe warunki końcowe dla każdej z metod public class A { int counter = 0; /*@ requires true; @*/ ensures P && Q; void m() {... } (27/37)

Specyfikacje behawioralne 1. Typ klasy: konstruktory, metody (z sygnaturami) 2. To nie opisuje zachowania 3. W JML-u typ to: jak w Javie + opis zachowania (28/37)

Uszczegółowienie Uszczegółowienie C specyfikacji A to taki opis, że każda implementacja C jest także implementacja A. Tłumaczac na prewarunki i postwarunki: Oznaczmy przez R A, R C prewarunki, zaś przez E A, E C odpowiednie postwarunki, powinno zachodzić: uszczegółowienie powinno mieć tę sama składnię (nazwy metod, liczby argumentów itp.) prewarunki sa zwiazane: R C R A postwarunki sa zwiazane: (R C E C ) (R A E A ) (29/37)

Behawioralny podtyp Podklasa uszczegółowienie typu klasy Podsumowanie relacja bycia podklasa gwarantuje poprawność strukturalna (obecność pól, metod itp.) relacja bycia podtypem gwarantuje brak błędów typowych, gdy podtypy sa używane w miejscu typów relacja bycia podtypem behawioralnym gwarantuje brak problemów z dziwnym zachowaniem, gdy podtypy sa używane w miejscu typów (30/37)

Behawioralny podtyp w JML-u Nadpisywana metoda dziedziczy specyfikacje z nadklasy Można dodać bardziej szczegółowy opis za pomoca słowa kluczowego also (31/37)

Behawioralny podtyp w JML-u Niezmienniki sa dziedziczone do podklas: class Parent {... //@ invariant invparent;... } class Child extends Parent {... //@ invariant invchild;... } niezmienniki niezmiennik w klasie Child to invchild && invparent (32/37)

Behawioralny podtyp w JML-u metody W wypadku specyfikacji metod wyglada to tak: class Parent { //@ requires i >= 0; //@ ensures \result >= i; int m(int i){... } } class Child extends Parent { //@ also //@ requires i <= 0 //@ ensures \result <= i; int m(int i){... } } Słowo kluczowe also wskazuje, że specyfikacje sa dziedziczone. (33/37)

Behawioralny podtyp w JML-u metody c.d. Metoda m w Child musi przestrzegać obu specyfikacji, więc pełna specyfikacja dla niej to: class Child extends Parent { } /*@ requires i >= 0; @ ensures \result >= i; @ also @ requires i <= 0; @ ensures \result <= i; @*/ int m(int i){... } Jakich wyników możemy się spodziewać? (34/37)

Behawioralny podtyp w JML-u metody c.d. Jeszcze inny sposób przedstawienia tej specyfikacji: class Child extends Parent { /*@ requires i >= 0 i <= 0; @ ensures \old(i)>=0 ==> \result >= i; @ ensures \old(i)<=0 ==> \result <= i; @*/ int m(int i){... } } (35/37)

Behawioralny podtyp różne Można osłabić behawioralność Należy zrelatywizować typ: \typeof(this) == \type(nadklasa) Dziedziczone też jest: normal_behavior, exceptional_behavior, signals (E e) false i in. (36/37)

Za tydzień Jeszcze trochę teorii Przykład wyspecyfikowanej klasy Co się może stać, gdy człowiek sobie obspecyfikuje? (37/37)