Specyfikacje formalne



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

Techniki zabezpieczania kodu - kontrola wyjatków. Temat VIII

WERYFIKACJA WSPOMAGANA KOMPUTEROWO

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

Programowanie obiektowe

Programowanie obiektowe

Platformy Programistyczne Podstawy języka Java

JAVA W SUPER EXPRESOWEJ PIGUŁCE

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

Programowanie obiektowe

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

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Dokumentacja do API Javy.

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

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

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 6

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Klasy abstrakcyjne i interfejsy

Java: interfejsy i klasy wewnętrzne

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Programowanie obiektowe

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 7

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

Diagramy klas. dr Jarosław Skaruz

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

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

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

Klasy abstrakcyjne, interfejsy i polimorfizm

Programowanie obiektowe

Programowanie obiektowe

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

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

PHP 5 język obiektowy

Języki i techniki programowania Ćwiczenia 2

Programowanie kontraktowe w Javie

Definiowanie własnych klas

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Rozdział 4 KLASY, OBIEKTY, METODY

Przypomnienie o klasach i obiektach

Dziedziczenie. dr Jarosław Skaruz

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

METODY PROGRAMOWANIA

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

Polimorfizm. dr Jarosław Skaruz

Modelowanie obiektowe

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Programowanie obiektowe

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Podstawy programowania III WYKŁAD 4

Co jeszcze mogą nam dać adnotacje? Adam Warski

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

Na przykładzie języków Java, C# i odrobiny C++ Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Formalna weryfikacja oprogramowania w lotnictwie

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Zaawansowane programowanie w języku C++ Klasy w C++

Java Język programowania

BEAN VALIDATION. Waldemar Korłub. Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska

Diagramy maszyn stanowych, wzorce projektowe Wykład 5 część 1

UML a kod. C++, Java i C#

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

Kurs WWW. Paweł Rajba.

Programowanie obiektowe

Programowanie obiektowe i język Java

Programowanie obiektowe

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

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Technologie i usługi internetowe cz. 2

Metody Metody, parametry, zwracanie wartości

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

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

Podstawy projektowania systemów komputerowych

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

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

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

Klasy i obiekty cz II

Wykład 4: Klasy i Metody

Projektowanie obiektowe oprogramowania Testowanie oprogramowania Wykład 13 Wiktor Zychla 2014

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Programowanie obiektowe

Enkapsulacja, dziedziczenie, polimorfizm

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

PARADYGMATY PROGRAMOWANIA Wykład 3

Wstęp do ruby dla programistów javy

Paradygmaty programowania

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Zofia Kruczkiewicz, Programowanie obiektowe - java, wykład 2 1

Programowanie obiektowe

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

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

Rozszerzenia JML-a do weryfikacji programów wielowatkowych

Programowanie obiektowe

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

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

Typy sparametryzowane

Programowanie i projektowanie obiektowe

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

Multimedia JAVA. Historia

Metody dostępu do danych

Transkrypt:

Specyfikacje formalne część II Piotr Szczepański Na podstawie: Formal Specification, Andreas Roth, Peter H. Schmitt

Krótkie przypomnienie JML Co to jest formalna specyfikacja? Co to jest OCL? Składnia języka. Przykłady. Wyrażenia Kontrakty operacji w JML Niezmienniki Pola i metody modelowe Porównanie JML z OCL Plan

Formalna specyfikacja Matematyczny opis oprogramowania, lub sprzętu. Specyfikacja stawianych wymagań. Formalne weryfikacje. Rafinacja programu, czyli transformacja specyfikacji w niskopoziomowy kod.

OCL Część standardu UML. Rozszerzenie diagramów. Język deklaratywny Specyfikuje niezmienniki klas warunki początkowe i końcowe operacji wartości początkowe i ograniczenia atrybutów

Java Modeling Language JML Język specyfikacji dla Javy. Rozwijany przez społeczność, nie ma standaryzacji OMG. Używany w fazie implementacji. Specjalne komentarze w kodzie. Budowa oparta na niezmiennikach i kontraktach operacji.

Składnia języka kontrakty operacji Warunki wstępne Karta włożona do bankomatu Pin poprawny Warunki końcowe Użytkownik uwierzytelniony

... /*@ public normal_behavior requires włożonakarta!= null requires!użytkownikuwierzytelniony Składnia języka kontrakty operacji requires pin == włożonakarta.poprawnypin assignable użytkownikuwierzytelniony ensures użytkownikuwierzytelniony also... @*/ public void wprowadźpin (int pin) {...

Kontrakt z bliska requires określa warunki wstępne kontraktu tworzy koniunkcję wszystkich warunków assignable opisuje jakie elementy mogą się zmienić lista rzeczy porozdzielanych przecinkami ensures określa warunki końcowe kontraktu

Widoczność private /*@ spec_public @*/ int length; private int len; public /*@ spec_protected @*/ int width; public int wid; /*@ public invariant length > 1 @*/ /*@ public invariant len > 1 @*/ /*@ public invariant width > 1 @*/ /*@ public invariant wid > 1 @*/

Widoczność private /*@ spec_public @*/ int length; private int len; public /*@ spec_protected @*/ int width; public int wid; /*@ public invariant length > 1 @*/ /*@ public invariant len > 1 @*/ BŁĘDNE! /*@ public invariant width > 1 @*/ BŁĘDNE! /*@ public invariant wid > 1 @*/

Wyjątki public exceptional_behavior requires włożonakarta == null signals_only ATMException signals(atmexception)!użytkownikuwierzytelniony

Wyjątki signals_only lista dopuszczonych typów wyjątków signals(e1) warunek końcowy w przypadku danego wyjątku

Czyste metody public/*@ pure @*/ boolean czykartawłożona() { } return włożonakarta!= null ; metody bez efektów ubocznych zawsze kończące swoje przebiegi

Niezmienniki statyczne public class KartaBankowa { } /*@ public static invariant (\forall KartaBankowa p1, p2; \created(p1) && \created(p2); p1!=p2 ==> p1.numerkarty!=p2.numerkarty) @*/ private /*@ spec_public @*/ int numerkarty;...

public class KartaBankowa { } Niezmienniki obiektów /*@ public instance invariant (\forall KartaBankowa p; this!= p ==> this.numerkarty!= p.numerkarty) @*/ private /*@ spec_public @*/ int numerkarty;...

Wszystkie wyrażenia Javy prócz: Wyrażenia JML operatorów powodujących efekt uboczny np: e++ operatorów przypisania nieczystych metod Operatory: implikacji (==>) równoważności (<==>) Kwantyfikatory \forall \exist \num_of, \sum, \product, \min, \max

Logika a wyrażenia e0!=e1 ~~>!([e0] = [e1]) e0?e1:e2 ~~> if [e0] then [e1] else [e2] e0 ==> e1 ~~> [e0] [e2] (\forall T e;e0;e1) ~~> T e (([e]!= null & [e0] ) [e1]) (\exists T e;e0;e1) ~~> T e ([e]!= null & [e0] & [e1])

Kwantyfikatory numeryczne (\sum int i; 0 <= i && i < 5; i) == 0 + 1 + 2 + 3 + 4 (\product int i; 0 < i && i < 5; i) == 1 * 2 * 3 * 4 (\max int i; 0 <= i && i < 5; i) == 4 (\min int i; 0 <= i && i < 5; i 1) == 1

Kwantyfikator uogólniony public class CentralnySerwer{ } /*@ public instance invariant this.liczbaważnychkart == (\num_of KartaBankowa p;!p.nieaktywna)...

ensures E; Kontrakty operacji w JML signals (ET1) S1;... signals(etn) Sn; signals_only OT1,..., OTm; (e=null [E]) & (e [ET1] = TRUE [S1])... & (e [ETn] = TRUE [Sn]) & (e [OE1] = TRUE... e [OEm] = TRUE )

Kontrakty operacji w JML assignable \nothing, \everything diverges Warunek jaki musi być spełniony przed wywołaniem operacji, jeśli się ona nie zakończy. diverges false diverges true

Specjalne kontrakty desugaring normal_behavior behavior requires R; requires R; assignable A; assignable A; ensures E; ensures E; diverges D; diverges D; signals (Exception) false;

Specjalne kontrakty desugaring exceptional_behavior behavior requires R; requires R; assignable A; assignable A; diverges D; ensures false; signals (ET) S; diverges D; signals_only(ot); signals(e) S; signals_only(ot);

Czyste metody desugaring Jak zastąpić adnotację /*@ pure @*/ przy danej metodzie odpowiem kontraktem?

Czyste metody desugaring Jak zastąpić adnotację /*@ pure @*/ przy danej metodzie odpowiem kontraktem? Dodać kontrakt operacji zawierający assignable \nothing diverges false

Lekkie kontrakty Kontrakty nie rozpoczynające się od słowa kluczowego behavior. Różnica z ciężkimi kontraktami jedynie w domyślnych wartościach przyjmowanych przez niepodane klauzule. requires \not_specified true assignable \not_specified \everything ensures \not_specified true diverges false false signals \not_specified (Exception) true

Opisywanie warunków końcowych... requires włożonakarta!= null; requires pin!= włożonakarta.poprawnypin; requires błędnychwprowadzeńpin >= 2;... ensures włożonakarta == null; ensures \old(włożonakarta).nieaktywna;...

Dziedziczenie dla kontraktów operacji Wszystkie kontrakty dla metod automatycznie przysługują metodom przedefiniowującym.... /*@ also jakiś_kontrakt @*/ @Override public void enterpin (int pin) {...

Odnoszą się do zmiennej this Niezmienniki w JML niezmienniki obiektów Muszą być spełnione w każdym widzialnym stanie obiektu wywołanie, ukończenie metody zakończenie konstruktora klasy kiedy żadna z metod, czy konstruktor nie jest w trakcie działania Metody z adnotacją /*@ helper @*/ zwolnione z zachowania niezmienników.

Niezmienniki w JML niezmienniki statyczne Mogą się odnosić do pól obiektu, jedynie jeśli jest on pod kwantyfikatorem. public class CentralnySerwer{ } public static int maxliczbakont; /*@ public instance invariant maxliczbakont >= 0 @*/ /*@ public static invariant maxliczbakont >= 0 @*/...

Pola i metody modelowe Rozszerzamy nasz przykład bankowy o interfejs public interface IBonusowaKarta{ } public void dodajpunkty(int nowepunkty); Jak dodać specyfikacje dla operacji, jeśli interfejs nie posiada żadnych pól?

Pola i metody modelowe public interface IBonusowaKarta { } /*@ public instance model int punktybonusowe; @*/ /*@ ensures punktybonusowe == \old(punktybonusowe)+nowepunkty; assignable punktybonusowe; @*/ public void dodajpunkty (int nowepunkty);

Pola i metody modelowe implementacja interfejsu public class KartaBankowa implements IbonusowaKarta { } /*@ public instance model int punktybonusowe; @*/ /*@ also assignable punktykarty; @*/ Public void dodajpunkty (int nowepunkty){ } punktykarty+=nowepunkty;

/*@ @*/ Pola i metody modelowe ustalenie relacji private represents punktybonusowe < punktykarty; /*@ @*/ private represents punktybonusowe \such_that punktybonusowe == punktykarty;

Wspieranie weryfikacji Chcemy dowieść, że program spełnia podaną specyfikację. Dodatkowo możemy wprowadzać niezmienniki do pętli. m = a[0]; i = 1; while ( i < a.length) { } /*@ ensures \forall integer x; 0>=x && x<i; a[x] >= m; assignable m,i @*/ if (a[i] < m) them m = a[i]; i++;

Przewaga OCL and JML OCL wyższego poziomu, może być stosowane przed powstaniem kodu. Automatyczne generowanie ograniczeń ze wzorów cięższe na poziomie kodowania. OCL nie jest ukierunkowany na konkretny język programowania. Wygodniejszy w modelowaniu systemów. OCL jest standardem OMG, w przeciwieństwie do JML.

Przewaga JML nad OCL JML jest bliższy językowi Java co wpłynęło na jego znacznie większą popularność w porównaniu do OCL. JML oferuje wiele ciekawych koncepcji na poziomie implementacji np.: opisywanie wyjątków opisywanie modyfikowanych pól niezmienniki pętli

Odnoszenie się do poprzedniego @pre Można stosować do indywidualnych symboli. a@pre.b@pre.c@pre a.b@pre.c \old Jedynie do wyrażeń. \old(a.b.c) \old(a).b.c a.b.\old(c) NIEPOPRAWNE stanu

Odnoszenie się do poprzedniego stanu Chcemy wyrazić, że metoda zmienia tablice i w końcowym stanie a[0] = a[idx] \old(a[idx]) BLĘDNE! a.get@pre(idx)

Odnoszenie się do poprzedniego stanu Chcemy wyrazić, że metoda zmienia tablice i w końcowym stanie a[0] = a[idx] (\forall int x; x==idx; \old(a[x]) == a[0]); a.get@pre(idx)

Modyfikowane lokacje JML KeY Jedynie lokacje wymienione za assignable mogą być zmieniane podczas działania metody. OCL Podczas wywołania mogą się zmieniać. Nie ma jasnego określenia. W rozszerzeniach do OCL zakłada się, że mogą się zmieniać jedynie lokacje wymienione w warunku końcowym

Zasięg kwantyfikatorów JML Kwantyfikatory przebiegają po wszystkich elementach, nie tylko stworzonych, czy zaalokowanych. Kwantyfikatory w niezmiennikach instancji przebiegają tylko po stworzonych. OCL Jedynie po stworzonych obiektach.

Liczby całkowite JML Używa typów Javy 1073741821 * 1073741821 = 2147483639 1073741822 * 1073741822 = 4 KeY OCL Pozwala wybierać pomiędzy liczbami całkowitymi w rozumieniu matematycznym czy JAVA. Nie pozwala kwantyfikować po wszystkich liczbach. Dopuszcza jedynie skończone zbiory.

Podsumowanie zastosowania i przydatne narzędzia Kompilacja z asercjami, sprawdzanie podczas działania programu jmlc. Tworzenie testów jednostkowych jmlunit. Sprawdzanie statyczne ESC/JAVA2. Weryfikacja programów LOOP,JACK,KeY. Narzędzia wspomagające jmlspec,canapa.

Dziękuję za uwagę

Odpowiedzi na niektóre pytania równość Jak interpretowany jest znak równości w JMLu? Dokładnie tak samo jak w Javie, jest to równość referencji. Jeśli chcielibyśmy porównywać stringi, używamy takiej jak w Javie notacji np: public String name; /*@ public invariant!name.equals( );@*/

Odpowiedzi na niektóre pytania diverges Kiedy właściwie ma być spełniony warunek początkowy przy słowie diverges? Metoda zapętli się. Metoda nie powróci do miejsca swojego wywołania. Wyjątki nie podchodzą pod warunek diverges. Np. dla metody System.exit warunek przy diverges zawsze będzie musiał być spełniony.