You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Statyczna analiza kodu wykorzystywana jest w celu znajdywania błędów w kodzie, wyszukiwanie luk i niedopatrzeń oraz do sprawdzania czy napisany kod spełnia zasady dobrego programowania i przestrzega wytycznych. Co więcej pozwala na detekcję hipotetycznych błędów, które mogły nie zostać wykrytę przez testy jednostkowe i manualne, a także ułatwia definiowanie i przestrzeganie standardów kodu w zespole. Dzięki temu utrzymanie odpowiedniej jakości kodu staje się łatwiejsze. Statyczna analiza jest częścią procesu ciągłej integracji (continous integration) i może być wykorzystywana również jako narzędzie wspierające testowanie (białoskrzynkowe) oraz refactoring. Dokonywana analiza przeprowadzana jest bez wykonania kodu i odbywa się przy pomocy różnych narzędzi analitycznych takich jak np. lint, pmd, findbugs czy checkstyle dostępnych jako plugin dla Gradle oraz platform wspierających ciągłą integracje jak np. SonarQube. Weryfikują one zgodność kodu w zestawieniu do zbioru reguł. W przypadku niespełnienia zasad informują o potencjalnych błędach i zagrożeniach.
13
+
`Statyczna analiza kodu` wykorzystywana jest w celu znajdywania błędów w kodzie, wyszukiwanie luk i niedopatrzeń oraz sprawdzania czy napisany kod spełnia zasady dobrego programowania i przestrzega wytycznych. Co więcej pozwala na detekcję hipotetycznych błędów, które mogły nie zostać wykrytę przez testy jednostkowe i manualne, a także ułatwia definiowanie i przestrzeganie `standardów kodu` w zespole. Dzięki temu utrzymanie odpowiedniej jakości kodu staje się łatwiejsze. Statyczna analiza jest częścią procesu `ciągłej integracji` (`continous integration`) i może być wykorzystywana również jako narzędzie wspierające `testowanie` (`białoskrzynkowe`) oraz `refactoring`. Dokonywana analiza przeprowadzana jest bez wykonania kodu i odbywa się przy pomocy różnych narzędzi analitycznych takich jak np. `lint`, `checkstyle`, `pmd` czy `findbugs` dostępnych jako `plugin` dla `Gradle` oraz platform wspierających ciągłą integracje jak np. `SonarQube`. Weryfikują one zgodność kodu w zestawieniu do zbioru reguł. W przypadku niespełnienia zasad informują o potencjalnych błędach i zagrożeniach. Nie rzadko różne pluginy zawierają podobną funkcjonalność co nie wyklucza ich ze wzajemnego użycia, wręcz przeciwnie, uzupełniają się.
14
14
15
15
## Checkstyle
16
-
Checkstyle analizuje kod źródłowy weryfikując jego standardy oraz konwencję w stosunku do zbioru wybranych zasad. Skupia się przede wszystkim na analizie stylu kodu (np. nazwenictwo, klamry).
16
+
`Checkstyle` analizuje kod źródłowy weryfikując jego standardy oraz konwencję w stosunku do zbioru wybranych zasad. Skupia się przede wszystkim na analizie stylu kodu (np. nazewnictwo, klamry). Aby stworzyć konfigurację dla checkstyle należy dodać plik zasad (np. `checkstyle.xml`) oraz uzupełnić plik `gradle` aplikacji (lub stworzyć nowy) o nowe zadanie co przedstawia poniższy listing.
17
17
18
-
//TODO
18
+
{% highlight xml %}
19
+
<?xml version="1.0"?>
20
+
<!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
Wykonane zadanie `checkstyle` dla klasy `CheckstyleCode` zwróci raport z uwagami dotyczącymi nie używanego import, nie poprawnych nazw dla stałej i metody oraz zbyt dużą ilość argumentów metody.
56
+
57
+
{% highlight java %}
58
+
import java.math.BigInteger; //unused import
59
+
60
+
public class CheckstyleCode {
61
+
62
+
public final static int someConstant = 1; //should be SOME_CONSTANT instead
63
+
64
+
public void some_method() { //should be someMethod instead
65
+
//body
66
+
}
67
+
68
+
public void methodTooManyParameters(int a, int b, int c) { //too many parameters - max 2
69
+
//body
70
+
}
71
+
}
72
+
{% endhighlight %}
19
73
20
74
## Pmd
21
-
PMD podobnie jak checkstyle przeprowadza analizę kodu w stosunku do zbioru zasad, jednakże skupia się on newralgicznych i opuszczonych fragmentach kodu (np. nieużywane zmienne, puste bloki).
75
+
`Pmd` podobnie jak checkstyle przeprowadza analizę kodu w stosunku do zbioru zasad, jednakże koncentruje się na newralgicznych i opuszczonych fragmentach kodu (np. nieużywane zmienne, puste bloki). Aby stworzyć konfigurację dla pmd należy dodać plik zasad (np. `pmd.xml`) oraz uzupełnić plik `gradle` aplikacji o nowe zadanie co przedstawia poniższy listing.
Wykonane zadanie `pmd` dla klasy `PmdCode` zwróci raport z uwagami dotyczącymi nie używanej zmiennej, pustej metody, braku klamr dla pętli oraz bloku warunkowego zawsze prawdziwego.
107
+
108
+
{% highlight java %}
109
+
public class PmdCode {
110
+
111
+
public void someMethod() {
112
+
int variable = 1; //unused variable
113
+
114
+
if(true) {
115
+
//always true
116
+
}
117
+
118
+
for(int i=0; i<=1; i++)
119
+
emptyMethod(); //no braces in loop
120
+
}
121
+
122
+
public void emptyMethod() {
123
+
}
124
+
}
125
+
{% endhighlight %}
24
126
25
127
## Findbugs
26
-
Findbugs działając w oparciu o kod bajtowy wykonuje analizę w poszukiwaniu potencjalnych problemów z listy znanych błędów projektowych i złych praktyk (np. jawnie zapisane hasło, klasa testowa nie posiada testów, metoda prywatna nie jest nigdy wywoływana).
128
+
`Findbugs` działając w oparciu o kod bajtowy wykonuje analizę w poszukiwaniu potencjalnych problemów z listy znanych błędów projektowych i złych praktyk (np. jawnie zapisane hasło, klasa testowa nie posiada testów, metoda prywatna nie jest nigdy wywoływana). Aby stworzyć konfigurację dla findbugs należy dodać plik filtrów (np. `findbugs.xml`) oraz uzupełnić plik `gradle` aplikacji o nowe zadanie co przedstawia poniższy listing.
Wykonane zadanie `findbugs` dla kodu bajtowego klasy `FindbugsCode` zwróci raport z uwagami dotyczącymi nie używanej metody prywatnej, porównywania obiektów typu `String` za pomocą operatora == oraz ignorowanie rezultatu metody.
154
+
155
+
{% highlight java %}
156
+
public class FindbugsCode {
157
+
158
+
public void someMethod() {
159
+
//boxed primitive allocated only for String value
160
+
String text = new Integer(1).toString(); //should use just Integer(1).toString()
161
+
equalityMethod(text, "b");
162
+
}
163
+
164
+
private boolean equalityMethod(String a, String b) {
165
+
boolean equality = (a == b); //== instead of equals
166
+
return equality;
167
+
}
168
+
169
+
private void unusedPrivateMethod() {
170
+
}
171
+
}
172
+
{% endhighlight %}
29
173
30
174
## Lint
31
-
Lint jest narzędziem dostarczonym przez Android Studio, który podobnie jak wspomniane wcześniej pluginy sprawdza pliki źródłowe pod kątem potencjalnych błędów, optymalizacji poprawności, bezpieczeństwa, wydajności, użyteczności i dostępności kodu. Z uwagi na integracje ze środowiskiem programistycznym nie wymaga konfiguracji.
175
+
`Lint` jest narzędziem dostarczonym przez `Android Studio`, który podobnie jak wspomniane wcześniej pluginy sprawdza pliki źródłowe pod kątem potencjalnych błędów, optymalizacji poprawności, bezpieczeństwa, wydajności, użyteczności i dostępności kodu. Z uwagi na integracje ze środowiskiem programistycznym nie wymaga dodatkowej konfiguracji.
0 commit comments