JavaRush /Blog Java /Random-PL /Przerwa kawowa #94. Przegląd pięciu statycznych analizato...

Przerwa kawowa #94. Przegląd pięciu statycznych analizatorów kodu Java. Błędy sterty Java i pamięci stosu

Opublikowano w grupie Random-PL

Przegląd pięciu statycznych analizatorów kodu Java

Źródło: DZone Programiści często potrzebują różnych programów, w tym statycznych analizatorów kodu, które mogą znaleźć i naprawić błędny kod na wczesnym etapie programowania. Chociaż recenzje kodu są nieocenionym narzędziem w tym przedsięwzięciu, czasami liczba recenzentów kodu, którzy muszą przeglądać i recenzować, jest zniechęcająca. To wymaga dużo czasu i wysiłku. Prowadzi to również do tego, że recenzenci często zwracają uwagę tylko na fragmenty kodu, które są krytyczne dla działania programu. Natomiast narzędzia analizy statycznej sprawdzają cały kod z tą samą dokładnością. Przerwa kawowa #94.  Przegląd pięciu statycznych analizatorów kodu Java.  Błędy pamięci stosu i sterty Java — 1Zebrałem kilka analizatorów kodu zgodnych z IntelliJ IDEA. Mam nadzieję, że pomoże Ci to w pracy.

Wbudowany analizator IntelliJ IDEA

Statyczny analizator kodu Java wbudowany w IntelliJ IDEA w niczym nie ustępuje wyspecjalizowanym narzędziom do analizy statycznej. Wyszukiwanie podejrzanych, zaśmieconych lub nieprawidłowych fragmentów kodu odbywa się przy użyciu różnych metod analizy statycznej: analizy przepływu danych i dopasowywania wzorców. IntelliJ IDEA ma dużą liczbę inspekcji. Tak naprawdę wiele z nich nie zawsze dokładnie zgłasza błąd. Wskazują raczej na niechlujstwo w kodzie lub możliwość jego zmiany za pomocą zgrabnej alternatywy. Po krótkim przestudiowaniu „Inspekcje → Java” zauważyłem jedną rzecz. Inspekcje w kategoriach błędów prawdopodobnych, problemów numerycznych i problemów z serializacją z większym prawdopodobieństwem wykryją błędy rzeczywiste. W każdym razie musisz sam przeprowadzić testy i określić, które z nich będą przydatne dla Twojego projektu. Ponieważ analiza statyczna jest wykonywana w trybie edycji kodu, w IntelliJ IDEA możesz naprawić błędy w ciągu kilku sekund od ich wystąpienia. Edytor natychmiast podświetla nieprawidłowy fragment kodu. Przerwa kawowa #94.  Przegląd pięciu statycznych analizatorów kodu Java.  Błędy pamięci sterty i stosu Java — 2To naprawdę wygodne i fajne! Ponadto, jeśli użyjesz kombinacji „Alt + Enter” na wybranym fragmencie kodu, możesz wybrać jedną z opcji naprawienia błędu poprzez menu kontekstowe: Możesz także dowiedzieć się, dlaczego przeprowadzono konkretną inspekcję Przerwa kawowa #94.  Przegląd pięciu statycznych analizatorów kodu Java.  Błędy pamięci stosu i sterty Java — 3. W niektórych przypadkach skraca to czas wyszukiwania: Przerwa kawowa #94.  Przegląd pięciu statycznych analizatorów kodu Java.  Błędy pamięci stosu i sterty Java — 4Możesz uruchomić analizę ręcznie, wybierając „Analizuj → Sprawdź kod”. Można też przeprowadzić indywidualne sprawdzenie za pomocą opcji „Analizuj → Uruchom sprawdzenie według nazwy”. Zanim to zrobisz, określ zakres analizy (dla projektu, modułu lub pojedynczego pliku). Po uruchomieniu analizy w ten sposób dostępne stają się pewne inspekcje, które ze względu na złożoność nie działają w trybie edycji. Po analizie wyniki zostaną pogrupowane według kategorii/katalogu w osobnym oknie. Z tego okna możesz przejść do konkretnego wyzwalacza walidacji: Przerwa kawowa #94.  Przegląd pięciu statycznych analizatorów kodu Java.  Błędy pamięci stosu i sterty Java — 5IntelliJ pozwala tylko na zapisanie wyniku analizy w formatach HTML i XML. Niestety, moim zdaniem najwygodniej jest pracować z wykrytymi problemami w samym IDE. Notatka. Większość funkcji analizatora statycznego jest dostępna w bezpłatnej wersji IntelliJ IDEA Community Edition.

SonarJava

SonarJava to statyczny analizator kodu dla języka Java firmy SonarSource. Lista jego funkcji obejmuje:
  • Ponad 150 reguł wykrywania błędów;
  • Ponad 350 reguł rozpoznawania zapachów kodu;
  • Ponad 40 reguł wykrywania potencjalnych podatności ;
  • Integracja z Maven, Gradle, Ant, Eclipse, IntelliJ IDEA, VS Code;
  • Możliwość rozbudowy o niestandardowe reguły diagnostyczne;
  • Specjalistyczne narzędzie SAST: większość reguł diagnostycznych opracowywana jest zgodnie z CWE , CERT , OWASP .
Analizę możesz uruchomić zarówno w różnych IDE (poprzez wtyczkę SonarLint ), jak i osobno w SonarQube . SonarLint może współpracować z wbudowanym analizatorem kodu IntelliJ IDEA. Jeśli najedziesz kursorem na podświetlony fragment kodu, często zobaczysz ostrzeżenia z obu analizatorów: Przerwa kawowa #94.  Przegląd pięciu statycznych analizatorów kodu Java.  Błędy pamięci stosu i sterty Java — 6Oczywiście możesz wyświetlić ostrzeżenie w osobnym oknie: Przerwa kawowa #94.  Przegląd pięciu statycznych analizatorów kodu Java.  Błędy pamięci stosu i sterty Java — 7Ogólnie rzecz biorąc, możliwość uruchamiania SonarJava na różne sposoby czyni go atrakcyjnym. Daje to programistom swobodę wyboru narzędzia podczas pisania kodu.

FindBugs/SpotBugs

Niestety FindBugs nie był aktualizowany przez długi czas; ostatnia stabilna wersja została wydana w 2015 roku. Ale nadal go pamiętamy i używamy, ponieważ jest to prawdopodobnie najsłynniejszy darmowy statyczny analizator kodu Java. Jeśli zapytasz programistę Java o analizę statyczną, prawdopodobnie natychmiast pomyśli o FindBugs. Analizator open source SpotBugs stał się logiczną kontynuacją porzuconego FindBugs. Ma wszystkie zalety i wady FindBugs. Czas pokaże, czy to dobrze, czy źle. W międzyczasie społeczność analizatorów aktywnie go rozwija. Kluczowe cechy SpotBugs:
  • Ponad 400 reguł wykrywania błędów;
  • Integracja z Ant, Maven, Gradle, Eclipse, IntelliJ IDEA;
  • Możliwość rozbudowy o niestandardowe reguły diagnostyczne.
Aby znaleźć podejrzany kod, stosuje się te same metodyki: dopasowywanie wzorców i analizę przepływu danych. Analizator wykrywa różnego rodzaju błędy związane z wielowątkowością, wydajnością, lukami w zabezpieczeniach, zaciemnianiem kodu i tak dalej. W IntelliJ IDEA okno alertów wygląda następująco: Przerwa kawowa #94.  Przegląd pięciu statycznych analizatorów kodu Java.  Błędy pamięci sterty i stosu Java — 8Alerty można grupować według kategorii, klasy, katalogu i poziomu zaufania. Możesz jednocześnie przeglądać alerty i dokumentację dotyczącą dowolnej reguły diagnostycznej. Analizę rozpoczyna się ręcznie. Po analizie wszystkie problematyczne fragmenty kodu są podświetlane wraz z innymi ostrzeżeniami IntelliJ IDEA i SonarLint. Jednak jest problem. Należy ponownie uruchomić analizę, aby zaktualizować ostrzeżenia i uwzględnić zmiany wprowadzone w pliku. Istnieje również wiele ostrzeżeń doradczych, dlatego przed aktywnym użyciem analizator należy skonfigurować.

Studio PVS

PVS-Studio opiera się na otwartej bibliotece Spoon. Pobiera kod źródłowy jako dane wejściowe i buduje dobrze zaprojektowany model AST z informacjami semantycznymi. W oparciu o ten model analizator wykorzystuje takie nowoczesne techniki jak:
  • Analiza przepływu danych;
  • Symboliczne przedstawienie;
  • Adnotacje dotyczące metod;
  • Analiza oparta na wzorcach.
Obecnie analizator wykorzystuje ponad 105 reguł diagnostycznych identyfikujących różne wady kodu. Należą do nich poprawki literówek, zmiana nazw odwołań zerowych, nieosiągalny kod, indeks tablicy poza granicami, naruszenie użycia kontraktu metody i inne błędy. Możesz dowiedzieć się o wszystkich możliwościach reguł diagnostycznych tutaj . Główne funkcje PVS-Studio:
  • Analizator koncentruje się na znalezieniu rzeczywistych błędów;
  • Oprócz wersji CLI dostępna jest także integracja z IntelliJ IDEA, Maven, Gradle, Jenkins, SonarQube;
  • Możliwość uruchomienia analizatora w trybie przyrostowym;
  • Analizator identyfikuje potencjalne problemy ze zgodnością z API Java SE podczas migracji projektu z Java 8 do nowszych wersji;
  • PVS-Studio konwertuje raport do różnych, przyjaznych dla użytkownika formatów: JSON, XML, HTML, TXT;
  • Specjalistyczne narzędzie SAST: większość reguł diagnostycznych opracowywana jest zgodnie z CWE , CERT , OWASP .

PMD

PMD to analizator statyczny typu open source. Identyfikuje typowe błędy programistyczne: nieużywane zmienne, puste bloki, tworzenie niepotrzebnych obiektów i inne problemy. Analizator wykorzystuje kod źródłowy jako dane wejściowe. Obecnie PMD analizuje jeden plik źródłowy na proces, co nakłada ograniczenia na kompletność analizy. Autorzy PMD zalecają złożenie projektu przed analizą. Umożliwia to wyodrębnienie informacji o typach używanych w analizowanym kodzie. Główne funkcje PMD:
  • Integracja z różnymi IDE (IntelliJ IDEA, Eclipse, NetBeans) i systemami kompilacji (Maven, Gradle, Ant);
  • Obsługuje różne formaty raportów analizatorów: SARIF, CSV, IDEA, JSON, tekst (domyślny), XML, HTML, TextColor i tak dalej;
  • Zawiera ponad 300 szablonów reguł diagnostycznych. Kategorie: styl kodowania, najlepsze praktyki, błędy, wielowątkowość, wydajność i tak dalej;
  • Udostępnia CPD (detektor kopiowania i wklejania) wraz z PMD, który wykrywa duplikaty w kodzie.
Jeśli spojrzymy na wszystkie reguły diagnostyczne, PMD jest bardziej skupiony na rozwiązywaniu problemów związanych ze stylem kodowania i wychwytywaniu oczywistych błędów. Reguły diagnostyczne mogą ze sobą kolidować, dlatego należy je skonfigurować przed użyciem analizatora. Możesz także przeprowadzić analizę poprzez wtyczkę do IntelliJ IDEA, ale nie możesz wybierać pojedynczych plików do analizy. Okno ostrzeżeń wygląda następująco: Przerwa kawowa #94.  Przegląd pięciu statycznych analizatorów kodu Java.  Błędy pamięci stosu i sterty Java — 9Moim zdaniem praca z ostrzeżeniami nie jest zbyt wygodna, gdyż nie można ich grupować według plików i nieoczywistych komunikatów. Pojawiają się tylko po najechaniu kursorem na ostrzeżenie.

Wniosek

Oczywiście oprócz analizatorów omówionych powyżej istnieją inne rozwiązania. Istnieją programy płatne (Coverity, Klockwork, JArchitect) i bezpłatne (Error Prone, Infer, Checkstyle). Wszystkie skupiają się na jednej rzeczy: zapobieganiu przedostawaniu się nieprawidłowego lub potencjalnie błędnego kodu do środowiska produkcyjnego. Nie mam prawa oceniać, który analizator lepiej sprawdzi się w tym zadaniu. Jednak analizatory, które opracowują analizę przepływu danych i wykonanie symboliczne, z większym prawdopodobieństwem znajdą prawdziwy błąd w kodzie. Jeśli wybierzesz analizator statyczny, zwróć uwagę na:
  • integracja z różnymi IDE;
  • integracja z systemami montażowymi;
  • łatwość uruchomienia analizatora na serwerze;
  • możliwość wykrywania błędów w trybie edycji kodu;
  • możliwość wygodnej pracy z ostrzeżeniami;
  • orientacja SAST;
  • odsetek wyników fałszywie pozytywnych;
  • złożoność konfiguracji.
  • Połączenie wszystkich zalet i wad doprowadzi Cię do liczby analizatorów statycznych, które uważasz za najlepsze.
Uwaga: Podałem przykłady integracji z IntelliJ IDEA, ponieważ często z niego korzystam.

Błędy sterty Java i pamięci stosu

Źródło: DZone Przyjrzymy się teraz głównym błędom, które mogą wystąpić na stercie lub w pamięci stosu Java, ale najpierw przypomnijmy sobie, co oznaczają te dwa terminy.
  • Pamięć sterty to specjalny obszar pamięci, w którym przechowywane są obiekty Java.
  • Pamięć stosu to obszar pamięci tymczasowej służący do przechowywania zmiennych podczas wywoływania metody.
Głównym wyjątkiem opisującym problem z pamięcią sterty jest java.lang.OutOfMemoryError . Przerwa kawowa #94.  Przegląd pięciu statycznych analizatorów kodu Java.  Błędy pamięci sterty i stosu Java — 10

Przestrzeń sterty Java

Ten błąd występuje, gdy program Java nie przydzieli nowego obiektu w obszarze pamięci sterty.

Przekroczono limit narzutu GC

Program Java spędza zbyt dużo czasu na usuwaniu elementów bezużytecznych. Ten błąd pojawia się, gdy zbieranie śmieci zajmuje 98% czasu programu i odzyskuje mniej niż 2% miejsca w pamięci.

public class OutOfMemoryErrorDemo {
    public static void main(String[] args) {
        int i = 0;
        List<String> stringList = new ArrayList<>();
        while (i < Integer.MAX_VALUE) {
            i++;
            String generatedString = new String( "Some string generated to show out of memory error example " + i);
            stringList.add(generatedString);
        }
    }
}
Tutaj stringList zawiera odniesienie do wygenerowanych przez nas ciągów, więc moduł zbierający elementy bezużyteczne nie może usunąć wygenerowanych ciągów z pamięci, ale próbuje usunąć wszelkie inne śmieci z aplikacji. Ale to nie wystarczy.

Żądany rozmiar tablicy przekracza limit maszyny wirtualnej

Błąd występuje podczas próby przydzielenia tablicy, gdy na stercie nie ma wystarczającej ilości miejsca.

public class OutOfMemoryErrorDemo {
    public static void main(String[] args) {
        // we try to create too long array
        long[] array = new long[Integer.MAX_VALUE];
    }
}

Metaprzestrzeń

Z tym komunikatem zgłaszany jest wyjątek, gdy w regionie metaprzestrzeni nie ma miejsca na informacje o danych klasowych.

Brak przestrzeni wymiany (żądanie rozmiaru bajtów z powodu. Brak przestrzeni wymiany?)

Błąd pojawia się, gdy nie udało się przydzielić pamięci na stercie natywnym lub jej rozmiar jest niewystarczający.

powód stack_trace_with_native_method

Natywny interfejs Java lub metoda natywna nie przydzieliły pamięci na stercie. StackOverFlowError — gdy jest zbyt wiele wywołań metod. Zwykle wyjątek jest zgłaszany przez metodę zawierającą rekurencję.

public class StackOverFlowErrorDemo {

    public static void main(String[] args) {
        recursiveMethod(2);
    }

    public static int recursiveMethod(int i) {
      	// it will never stop and it allocates all stack memory
        return recursiveMethod(i);
    }
}
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION