• Nie Znaleziono Wyników

Co jeszcze mogą nam dać adnotacje?

N/A
N/A
Protected

Academic year: 2021

Share "Co jeszcze mogą nam dać adnotacje?"

Copied!
31
0
0

Pełen tekst

(1)

Co jeszcze mogą nam dać adnotacje?

Adam Warski

(2)
(3)

Weryfikacja statyczna

Sprawdzanie własności programu

bez jego uruchomienia

(4)

Weryfikacja statyczna

Najprostszy przykład:

Sprawdzanie typów

Przy wywołaniu metody parametr musi być odpowiedniego typu

To samo przy przypisaniu

(5)

FindBugs

Analizuje bajtkod

Osobny proces, ale:

Wtyczka do Mavena Target Anta

Szuka „bug patterns”

Wykrywa bardzo wiele częstych błędów

(6)

FindBugs

equals() method defined that doesn't override Object.equals(Object)

int value cast to float and then passed to Math.round

Class defines tostring(); should it be toString()

The equals and hashCode methods of URL are blocking

Method synchronizes on an updated field

(7)

FindBugs - adnotacje

Adnotując nasz program udostępniamy dodatkowe informacje

Jaki może być parametr?

Co może zwrócić metoda?

Dodatkowa specyfikacja

Dokumentacja

(8)

FindBugs - null

NPE – chyba najczęstszy wyjątek

Generalnie trudno zweryfikować że program jest w 100% „NPE-safe”

Na przykład:

map.get(„wiem e to jest kluczem”);

(9)

FindBugs - null

Parametr/zwracana wartość nie może być null: @NonNull

Może być: @Nullable

Trzeba sprawdzić: @CheckForNull

(10)

FindBugs - null

void test1(@NonNull Object param) { param.toString(); // ok

}

void test2() {

test1(null); // b d }

(11)

FindBugs - null

void test1(@Nullable Object param) { param.toString(); // ?

}

void test2() {

test1(null); // ok test1(new Object()); // ok }

(12)

FindBugs - null

void test1(@CheckForNull Object param) { param.toString(); // b d

if (param != null) {

param.toString(); // ok }

}

void test2() {

test1(null); // ok

test1(new Object()); // ok }

(13)

FindBugs - @CheckReturnValue

@CheckReturnValue

public boolean isValid() { // walidacja obiektu

}

public void test() {

isValid(); // b d

if (isValid()) { … } // ok

(14)

FindBugs – własny detector

Demo

(15)

FindBugs sprawdza FindBugsa

Dużo operacji na nazwach klas

Dwie anotacje:

@DottedClassName

@SlashedClassName

(16)

JSR308 – type annotations

Część Javy 7

Rozszerzenie miejsc, które możemy adnotować o typy

Wszędzie tam, gdzie występuje typ (klasa), możemy dodać adnotację

@NotNull String zmienna;

Map<String, @NotNull String> mapa;

class Klasa<? extends @NotNull String>

(17)

Ale po co?

Chcemy powiedzieć, że obiekt może mieć ograniczony zbiór wartości

Np. @NonNull: wartość null jest zabroniona

Adnotowanie parametrów/metod to tylko trick

(18)
(19)

JSR 308 – checkers framework

Analizuje kod źródłowy

Sprawdza poprawne użycie adnotacji na typach

Wymaga kompilatora Javy 7 ale …

Część kompilacji lub osobny proces

Wtyczka do Mavena

(20)

JSR 308 bez Javy 7

javac jest napisany w javie

Można uruchomić za pomocą Javy 6

Wystarczy podać dobry bootclasspath

Anotacje w „nowych” miejscach: w komentarzach

(21)

Nullness checker

Adnotacje: @NonNull, @Nullable,

@PolyNull, @LazyNonNull, ...

Domyślnie: NNEL

Robi to co FindBugs tylko ma „łatwiej”

Podstawowe heurystyki dla map/kolekcji:

for-each loop (List<@NonNull String>)

(22)

IGJ Checker

@Immutable

@ReadOnly

@Mutable

@I

Domyślnie: @RO dla zmiennych lokalnych i parametrów typowych

(23)

Inne checkery

Interning checker

Regex checker

Internationalization checker

Tainting checker

Lock checker

(24)

Własny checker

Tworzymy adnotacje

Hierarchia typów

Domyślnie dla (…)

Tworzymy checker: podklasa Checker

Uruchamiamy

javac -processor $CHECKER -proc:only

-sourcepath $SOURCEPATH

-cp $CLASSPATH -d build $SOURCES

(25)

Własny checker – @Encrypted

Demo

(26)

Co jeszcze? Typestate checker

Typ obiektu jest stały

Stan obiektu może się zmieniać …

Przez wywoływanie metod

Typestate = stan + typ

(27)

Typestate checker

Zmieniający się obiekt ~ automat

Definiujemy przestrzeń stanów

Definiujemy przejścia

Oczywiście za pomocą anotacji :)

(28)

Typestate checker

Demo

(29)

Co dalej?

Kto jest właścicielem obiektu?

(aliasowanie)

@Pure

Scala – pluginy do kompilatora

(...)

(30)

Linki

http://types.cs.washington.edu/jsr308/

http://findbugs.sourceforge.net/

http://www.warski.org/typestate.html

(31)

Dziękuje!

Pytania?

http://www.warski.org

Cytaty

Powiązane dokumenty

Jeśli wiadomo, że wszystkich kuponów jest 185 250 786, to aby dowiedzieć się ile one wszystkie kosztują należy ich ilość pomnożyć przez cenę jednego kuponu; 4

Uzupełniono kod metody equals, która przesłania metodę equals dziedziczoną od klasy Object.. Java Zofia

The YOLO algorithm with anchor boxes assigns each object in training image to the grid cell that contains the object’s midpoint and the appropriate anchor box for the grid cell

Zastanówmy się, jakie ciężary należy umieścić w wierzchołkach (nieważkiego) trójkąta, aby jego środek ciężkości znalazł się we wskazanym punkcie..

Figure 2 shows the TU Delft proposal for the new conceptual model of the topographic data (DLM) based on the geometry object model specified in the OpenGIS Simple

We extend the method for the automatic computation of high-order optical aberration coefficients to in- clude (1) a finite object distance and (2) an infinite entrance pupil

Define no-arg constructor (constructor which takes no arguments), which would assign 0 to the attribute n, which store information about pre- sent number of elements in the pile,

In class Exception, in method two() between writing to the console add condition, when variable isException is equals true throw an exception A().. Correct error by catching