Techniki zabezpieczania kodu - kontrola wyjatków. Temat VIII

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

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

Specyfikacje formalne

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

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

Wyjątki Monika Wrzosek (IM UG) Programowanie obiektowe 180 / 196

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

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

Programowanie obiektowe

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

Co jeszcze mogą nam dać adnotacje? Adam Warski

Języki i metody programowania Java INF302W Wykład 3 (część 1)

Programowanie Obiektowe Ćwiczenie 4

Aplikacje w środowisku Java

Dawid Gierszewski Adam Hanasko

WYJĄTKI. Jest ona jednak czasochłonna i prowadzi do duŝego zapotrzebowania na zasoby systemu.

Zad.30. Czy można utworzyć klasę, która implementuje oba interfejsy?

Polimorfizm, metody wirtualne i klasy abstrakcyjne

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

WERYFIKACJA WSPOMAGANA KOMPUTEROWO

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

Dziedziczenie. dr Jarosław Skaruz

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

Programowanie obiektowe

Wykład 04. Programowanie obiektowe. Maciej Wołoszyn 17 marca Spis treści

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

Platformy Programistyczne Wykład z Javy dla zaawansowanych

Java SE Laboratorium nr 4. Temat: Obsługa wyjątków i zdarzeń

Efekty uboczne błędów

PARADYGMATY PROGRAMOWANIA Wykład 4

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

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

Testowanie II. Celem zajęć jest zapoznanie studentów z oceną jakości testów przy wykorzystaniu metryk pokrycia kodu testami (ang. code coverage).

Techniki zabezpieczania kodu analiza przepływu informacji. Temat V

Obsługa wyjątków. Rysunek 2-4 Hierarchia dziedziczenia klas wyjątków

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

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

Programowanie obiektowe

Testowanie II. Cel zajęć. Pokrycie kodu

Języki i techniki programowania Ćwiczenia 2

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

1. Co będzie wynikiem wykonania poniŝszych instrukcji? g2d.gettransform().scale(1, -1); g2d.gettransform().translate(4, -8); g2d.drawline(4, 0, 4, 4);

Programowanie kontraktowe w Javie

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

Rozszerzenia JML-a do weryfikacji programów wielowatkowych

Programowanie obiektowe

Oracle PL/SQL. Paweł Rajba.

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

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

Klasy abstrakcyjne, interfejsy i polimorfizm

Kurs programowania. Wykład 7. Wojciech Macyna. 25 kwietnia 2017

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

Ada-95. Dariusz Wawrzyniak

Formalna weryfikacja oprogramowania w lotnictwie

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

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

METODY PROGRAMOWANIA

Klasyfikacja wyjątków

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 7 maja K.Grzelak (Wykład 8) Programowanie w C++ 1 / 31

Wywoływanie metod zdalnych

Programowanie obiektowe

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

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

Pakiety i interfejsy. Tomasz Borzyszkowski

Polimorfizm. dr Jarosław Skaruz

Tworzenie aplikacji w języku Java

Aplikacje w środowisku Java

Szablony. Szablony funkcji

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Wyjątki (exceptions)

Klasy abstrakcyjne i interfejsy

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.

Rozdział 4 KLASY, OBIEKTY, METODY

Delphi Laboratorium 3

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

JUnit TESTY JEDNOSTKOWE. Waldemar Korłub. Platformy Technologiczne KASK ETI Politechnika Gdańska

Konwencje obsługi błędów

Wprowadzanie danych z klawiatury. Wyjątki związane z wprowadzaniem danych, przekroczeniem rozmiaru tablicy, dzieleniem przez zero itd.

Programowanie obiektowe

Programowanie obiektowe

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Programowanie poprzez testy z wykorzystaniem JUnit

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Model-checking programów w Javie

Optimizing Programs with Intended Semantics

Platformy Programistyczne Podstawy języka Java

Java Podstawy. Michał Bereta

Typy uogólnione. Programowanie obiektowe. Jacek Sroka na podstawie materiałów Janusza Jabłonowskiego. 8 kwietnia 2013

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

Programowanie obiektowe

Wstęp do Programowania 2

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

TYPY GENERYCZNE (GENERICS)

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

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

Systemy Rozproszone - Ćwiczenie 6

Remote Method Invocation 17 listopada 2010

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

Wywoływanie metod zdalnych

1. Język JAVA. 1. Pierwszy program. 2. Kalkulator. 3. Klasy. 4. Dziedziczenie

Transkrypt:

Techniki zabezpieczania kodu - kontrola wyjatków Temat VIII

Wyjatki w Javie To nie sa wyjatki Rodzaje Throwable błędy wyjatki wyjatki zwykłe wyjatki czasu wykonania (2/39)

Wyjatki na co uważać? Typowy interfejs Throwable printstacktrace() czy po sprawdzeniu tajnych danych wyrzucamy wyjatki? getmessage() czy opisy sa jednorodne ze względu na tajne dane to String() czy typy wyjatków sa jednorodne ze względu na tajne dane implementuje interfejs Serializable (3/39)

Wyjatki printstacktrace() java.lang.nullpointerexception at org.tigris.subversion.subclipse.ui.decorator.svnlightweightdecorator. decoratetextlabel(svnlightweightdecorator.java:362) at org.tigris.subversion.subclipse.ui.decorator. SVNLightweightDecorator.decorate(SVNLightweightDecorator.java:305) at org.eclipse.ui.internal.decorators.lightweightdecoratordefinition. decorate(lightweightdecoratordefinition.java:253) at org.eclipse.ui.internal.decorators. LightweightDecoratorManager$LightweightRunnable. run(lightweightdecoratormanager.java:71) at org.eclipse.core.runtime.saferunner.run(saferunner.java:37) at org.eclipse.core.runtime.platform.run(platform.java:843) at org.eclipse.ui.internal.decorators.lightweightdecoratormanager. decorate(lightweightdecoratormanager.java:336) at org.eclipse.ui.internal.decorators.lightweightdecoratormanager. getdecorations(lightweightdecoratormanager.java:322) at org.eclipse.ui.internal.decorators.decorationscheduler$1. ensureresultcached(decorationscheduler.java:338) at org.eclipse.ui.internal.decorators.decorationscheduler$1. run(decorationscheduler.java:308) at org.eclipse.core.internal.jobs.worker.run(worker.java:58) (4/39)

Błędy klasa Error Error to podklasa Throwable Poważny problem Sensowny program nie powinien wyłapywać (uwaga na przekazywane informacje) Najważniejsze kategorie: błędy maszyny wirtualnej błędy w linkowaniu dynamicznego kodu błędy w parsowaniu adnotacji błędy w asercjach inne błędy platformy Brak wpływu na typ, opis i zapis stosu (5/39)

Błędy RuntimeException Sensowny program może wyłapywać Nie trzeba wymieniać w klauzulach throws Przykłady: ClassCastException IndexOutOfBoundsException, ArrayStoreException i inne (6/39)

JML Java Modeling Language Formalny język specyfikacji dla Javy Zapis decyzji implementacyjnych i projektowych Sprawdzanie z rzeczywistym kodem Cel: JML powinien być łatwy dla programistów (7/39)

JML podstawy syntaktyczne JML w komentarzach /*...*/ lub //... Własności opisywane wyrażeniami boolowskimi Drobne rozszerzenia wyrażeń (\old, \forall, \result) (8/39)

JML biurokracja Specyfikacje w JML-u moga być tak silne i tak słabe, jak nam się podoba /*@ requires amount >= 0; ensures true; @*/ public int debit(int amount) {... Domyślny post-warunek ensures true można opuścić. (9/39)

Narzędzia dla JML-a parsowanie i sprawdzanie typów sprawdzanie asercji w czasie wykonania (jmlrac) rozszerzone sprawdzanie statyczne, tzn. automatyczna weryfikacja programu (ESC/Java2) weryfikacja programów (LOOP, Krakatoa+Why i in.) (10/39)

Sprawdzanie asercji w czasie wykonania Kompilator jmlrac z Iowa State Univ. tłumaczy asercje JML na sprawdzenia w czasie wykonania (wszystkie asercje sa sprawdzane i każde ich naruszenie jest zgłaszane jako bład) tanie i łatwe w adaptacji do istniejacej infrastruktury testowania lepsze testowanie i lepsza odpowiedź (bo więcej własności jest testowane i w większej liczbie miejsc kodu), np. komunikat Invariant violated in line 8000 po 1 minucie zamiast Null- PointerException in line 2000 po 4 minutach Oczywiście bład może być w kodzie lub w specyfikacji Narzędzie jmlunit łaczy jmlrac i testowanie jednostkowe (11/39)

Rozszerzone statyczne sprawdzanie Narzędzie ESC/Java(2) Rozszerzone statyczne sprawdzanie = w pełni zautomatyzowana weryfikacja programów przy pewnych kompromisach, aby zapewnić pełna automatyzację Wykonywana jest próba udowodnienia w czasie kompilacji zgodności specyfikacji z kodem (12/39)

Rozszerzone statyczne sprawdzanie Metoda nie jest poprawna ESC/Java może nie zauważyć istniejacego błędu Metoda nie jest pełna ESC/Java możę ostrzegać o błędach, które nie sa możliwe...ale szybko znajduje dużo potencjalnych błędów Dobra przy stwierdzaniu braku wyjatków czasu wykonania i weryfikacji dosyć prostych własności (13/39)

Rodzaje ostrzeżeń w ESC/Java2 Ostrzeżenia o możliwych wyjatkach czasu wykonania (Cast, Null, NegSize, IndexTooBig, IndexNegative, ZeroDiv, ArrayStore) To najczęstsze wyjatki czasu wykonania wynikajace z problemów w kodowaniu (tzn. nie wyrzucane jawnie) To nie wszystkie wyjatki Pozostałe w większości jawnie rzucane przez metody biblioteczne (14/39)

Wyjatki raportowane Wyjatki raportowane w Javie (np. FileNotFoundException) to wyjatki, które nie sa RuntimeExceptions lub Error Wyjatki pojawiajace się w ciele metody sa wymagane w deklaracjach throws Narzędzia JML-a sprawdzaja, czy deklaracje throws sa poprawne (jak kompilator) Zwykle wyjatki te pojawiaja się w klauzulach signals w JMLu (15/39)

Wyjatki raportowane c.d. ESC/Java2 sprawdza przez wnioskowanie, czy podany warunek zachodzi Domyślna specyfikacja: signals (OccurringException) true; ESC/Java2 zakłada, że wyjatki raportowane niezadeklarowane w throws nie będa się pojawiać (16/39)

Wyjatki nieraportowane Wyjatki nieraportowane (np. NoSuchElementException) to RuntimeExceptions Java nie wymaga, aby były deklarowane w klauzulach throws ESC/Java2 jest bardziej restrykcyjne pojawi się ostrzeżenie Exception jeśli nieraportowany wyjatek zostanie rzucony, ale nie jest zadeklarowany w throws Ostrzeżenie: obecnie ESC/Java2 zakłada, że niezadeklarowany wyjatek nieraportowany nie będzie wyrzucony, nawet jeśli pojawia się w klauzulu signals Deklaruj wszystkie nieraportowane wyjatki, jakie moga być rzucane (zwłaszcza, ponieważ nie można tego sprawdzić) (17/39)

Ostrzeżenia typu Cast Ostrzeżenie Cast pojawia się, gdy ESC/Java2 nie jest w stanie stwierdzić, że nie będzie wyrzucony wyjatek ClassCastException: public class CastWarning { public void m(object o) { String s = (String)o; daje ------------------------------------------------------------ CastWarning.java:3: Warning: Possible type cast error (Cast) String s = (String)o; ------------------------------------------------------------ (18/39)

Ostrzeżenia typu Cast c.d. Poniżej jest OK: public class CastWarningOK { public void m(object o) { if (o instanceof String) { String s = (String)o; (19/39)

Ostrzeżenia typu Cast c.d. Poniżej też OK: public class CastWarningOK2 { //@ requires o instanceof String; public void m(object o) { String s = (String)o; (20/39)

Ostrzeżenia typu Null Ostrzeżenie Null pojawia się, gdy ESC/Java2 nie jest w stanie stwierdzić, że nie będzie wyrzucony wyjatek NullPointerException: public class NullWarning { public void m(object o) { int i = o.hashcode(); daje ------------------------------------------------------------ NullWarning.java:3: Warning: Possible null dereference (Null) int i = o.hashcode(); ------------------------------------------------------------ (21/39)

Ostrzeżenia typu Null c.d. Poniżej jest OK: public class NullWarningOK { public void m(/*@ non_null */ Object o) { int i = o.hashcode(); (22/39)

Ostrzeżenia typu Null c.d. W wielu warunkach JML-owych mówi się o tym, że referencje nie sa null. Wprowadza się wygodne skróty: public class Directory { private /*@ non null @*/ File[] files; void createsubdir(/*@ non null @*/ String name){... Directory /*@ non null @*/ getparent(){... (23/39)

Ostrzeżenia typu ArrayStore Ostrzeżenie ArrayStore pojawia się, gdy ESC/Java2 nie jest w stanie stwierdzić, że nie będzie wyrzucony wyjatek ArrayStoreException: public class ArrayStoreWarning { public void m(object o) { Object[] s = new String[10]; s[0] = o; daje ------------------------------------------------------------ ArrayStoreWarning.java:4: Warning: Type of right-hand side possibly not a subtype of array element type (ArrayStore) s[0] = o; ------------------------------------------------------------ (24/39)

Ostrzeżenia typu ArrayStore c.d. Poniżej jest OK: public class ArrayStoreWarningOK { public void m(object o) { Object[] s = new String[10]; if (o instanceof String) s[0] = o; (25/39)

Pozostałe typy ZeroDiv zgłaszany, gdy dzielnik (dzielenie całkowitoliczbowe) może być 0 NegSize zgłaszany, gdy rozmiar tablicy przy alokacji może być ujemny IndexNegative zgłaszany, gdy indeks tablicy może być ujemny IndexTooBig zgłaszany, gdy indeks tablicy może być większy lub równy jej długości (26/39)

Pozostałe typy c.d. public class Index { void m() { int i = 0; int j = 8/i; // powoduje ostrzeżenie ZeroDiv Object[] oo = new Object[i-1];// ostrzeżenie NegSize oo = new Object[10]; i = oo[-1].hashcode(); // ostrzeżenie IndexNegative i = oo[20].hashcode(); // ostrzeżenie IndexTooBig (27/39)

Ostrzeżenie o wyjatkach public class Ex { public void m(object o) { if (!(o instanceof String)) throw new ClassCastException(); daje ------------------------------------------------------------ Ex.java:4: Warning: Possible unexpected exception (Exception) Execution trace information: Executed then branch in "Ex.java", line 3, col 32. Executed throw in "Ex.java", line 3, col 32. ------------------------------------------------------------ (28/39)

Ostrzeżenie o wyjatkach c.d. Można to wyłaczyć: deklarujac wyjatek w klauzuli throws lub przez //@ nowarn Exception; w wierszu, który wywołuje wyjatek lub przy pomocy opcji wywołania -nowarn Exception (29/39)

Wyjatki dopuszczane przez specyfikacje 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; (30/39)

Wyjatki dopuszczane przez specyfikacje c.d. 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 (31/39)

Pozbywanie się wyjatków W celu pozbycia się konkretnego wyjatku SomeException: 1. usuń go z klauzuli throws (możliwe tylko dla nieraportowanych wyjatków) 2. dodaj jawne signals (SomeException) false; 3. ogranicz zbiór dozwolonych wyjatków używajac postwarunku takiego jak: signals (Exception e) e instanceof E1... e instanceof En; lub równoważnie skróconej wersji powyższego signals_only E1,..., En; (32/39)

Pozbywanie się wyjatków Aby pozbyć się wszystkich wyjatków 1. usuń wszystkie wyjatki z klauzuli throws (możliwe tylko dla wyjatków nieraportowanych) 2. dodaj jawne signals (Exception) false; 3. użyj słowa kluczowego normal_behavior, aby pozbyć się wszystkich wyjatków /*@ normal_behavior requires... ensures... @*/ normal_behavior ma implicite signals (Exception) false (33/39)

Może a musi rzucić wyjatek 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 (34/39)

Może a musi rzucić wyjatek c.d. Przykład użycia /*@ exceptional_behavior @*/ requires amount > balance; signals (BankException e) public int debit(int amount) {... e.getreason.equals("amount too big") mówi, że BankException musi być wyrzucone, gdy amount > balance. (35/39)

Może a musi rzucić wyjatek c.d. Klauzula normal_behavior ma domyślnie signals(exception) false; klauzula exceptional_behavior ma domyślnie ensures false (36/39)

Może a musi rzucić wyjatek c.d. To samo, trochę inaczej /*@ requires true; ensures \old(amount<=balance) &&... signals (BankException e) \old(amount>balance) &&... @*/ public int debit(int amount) throws BankException {... (37/39)

Wyjatki morał Morał: dla uproszczenia zabronić wyjatków w specyfikacjach, gdziekolwiek to możliwe, np. dla public void arraycopy(int[] src, int destoffset, int[] dest, int destoffset, int lenght) throws NullPointerException, ArrayIndexOutOfBoundsException napisać specyfikację, która zabrania wyrzucania wyjatków, a podawać exceptional_behaviour jeśli to jest gdzieś naprawdę potrzebne (38/39)