Analiza statyczna – od wprowadzenia do integracji

Masz dość niekończącego się przeglądania kodu lub debugowania, czasami myślisz o tym, jak uprościć swoje życie. A po krótkich poszukiwaniach lub przypadkowym natknięciu się na nie, możesz zobaczyć magiczne zdanie: „Analiza statyczna”. Zobaczmy, co to jest i jak może współdziałać z Twoim projektem.

Analiza statyczna – od wprowadzenia do integracji
Tak naprawdę, jeśli piszesz w jakimkolwiek współczesnym języku, to nawet nie zdając sobie z tego sprawy, przepuszczasz go przez analizator statyczny. Faktem jest, że każdy nowoczesny kompilator zapewnia, choć niewielki, zestaw ostrzeżeń o potencjalnych problemach w kodzie. Na przykład podczas kompilowania kodu C++ w programie Visual Studio może zostać wyświetlony następujący komunikat:

Analiza statyczna – od wprowadzenia do integracji
W tym wyniku widzimy, że zmienna było nigdy nie był używany w żadnym miejscu tej funkcji. Tak więc w rzeczywistości prawie zawsze korzystałeś z prostego statycznego analizatora kodu. Jednak w przeciwieństwie do profesjonalnych analizatorów, takich jak Coverity, Klocwork czy PVS-Studio, ostrzeżenia dostarczane przez kompilator mogą wskazywać jedynie niewielki zakres problemów.

Jeśli nie wiesz na pewno, czym jest analiza statyczna i jak ją wdrożyć, przeczytaj ten artykułaby dowiedzieć się więcej o tej metodologii.

Dlaczego potrzebujesz analizy statycznej?

W skrócie: przyspieszenie i uproszczenie.

Analiza statyczna pozwala znaleźć w kodzie wiele różnych problemów: od nieprawidłowego użycia konstrukcji językowych po literówki. Na przykład zamiast

auto x = obj.x;
auto y = obj.y;
auto z = obj.z;

Napisałeś następujący kod:

auto x = obj.x;
auto y = obj.y;
auto z = obj.x;

Jak widać, w ostatnim wierszu jest literówka. Na przykład PVS-Studio wyświetla następujące ostrzeżenie:

V537 Rozważ sprawdzenie poprawności użycia elementu „y”.

Jeśli chcesz wtrącić się w ten błąd, wypróbuj gotowy przykład w Eksploratorze kompilatora: *płakać*.

I jak rozumiesz, nie zawsze można od razu zwrócić uwagę na takie sekcje kodu, dlatego możesz usiąść na debugowaniu na dobrą godzinę i zastanawiać się, dlaczego wszystko działa tak dziwnie.

Jest to jednak wyraźny błąd. Co jeśli programista napisał nieoptymalny kod, ponieważ zapomniał o subtelnościach języka? Lub nawet pozwolił na to w kodzie niezdefiniowane zachowanie? Niestety, takie przypadki są całkowicie powszechne i lwią część czasu poświęca się na debugowanie specjalnie działającego kodu, który zawiera literówki, typowe błędy lub niezdefiniowane zachowanie.

Właśnie dla takich sytuacji pojawiła się analiza statyczna. Jest to asystent programisty, który wskaże różne problemy w kodzie i wyjaśni w dokumentacji, dlaczego nie trzeba pisać w ten sposób, do czego może to doprowadzić i jak to naprawić. Oto przykład, jak to może wyglądać: *płakać*.

Więcej ciekawych błędów, które analizator potrafi wykryć, znajdziesz w artykułach:

Teraz, gdy przeczytałeś ten materiał i jesteś przekonany o zaletach analizy statycznej, możesz chcieć ją wypróbować. Ale od czego zacząć? Jak zintegrować nowe narzędzie z obecnym projektem? I jak przedstawić mu zespół? Odpowiedzi na te pytania znajdziesz poniżej.

Uwaga. Analiza statyczna nie zastępuje ani nie anuluje tak przydatnej rzeczy, jak recenzje kodu. Uzupełnia ten proces, pomagając z wyprzedzeniem zauważyć i poprawić literówki, nieścisłości i niebezpieczne projekty. O wiele bardziej produktywne jest skupienie się na przeglądach kodu pod kątem algorytmów i przejrzystości kodu, zamiast szukać błędnie umieszczonych nawiasów lub czytaj nudne funkcje porównawcze.

0. Zapoznanie się z narzędziem

Wszystko zaczyna się od wersji próbnej. Rzeczywiście, trudno jest zdecydować się na wprowadzenie czegoś do procesu rozwoju, jeśli nigdy wcześniej nie widziałeś narzędzia na żywo. Dlatego pierwszą rzeczą, którą powinieneś zrobić, to pobrać wersja próbna.

Czego dowiesz się na tym etapie:

  • Jakie są sposoby interakcji z analizatorem;
  • Czy analizator jest kompatybilny z Twoim środowiskiem programistycznym?
  • Jakie problemy występują obecnie w Waszych projektach?

Po zainstalowaniu wszystkiego, czego potrzebujesz, pierwszą rzeczą, którą powinieneś zrobić, to przeprowadzić analizę całego projektu (Windows, Linux, macOS). W przypadku PVS-Studio w Visual Studio zobaczysz podobny obrazek (klikalny):

Analiza statyczna – od wprowadzenia do integracji
Faktem jest, że analizatory statyczne zwykle wydają ogromną liczbę ostrzeżeń dla projektów z dużą bazą kodu. Nie ma potrzeby naprawiania ich wszystkich, ponieważ Twój projekt już działa, co oznacza, że ​​te problemy nie są krytyczne. Jednak ty możesz przejrzeć najciekawsze ostrzeżenia i skorygować je, jeśli to konieczne. Aby to zrobić, musisz przefiltrować dane wyjściowe i pozostawić tylko najbardziej wiarygodne wiadomości. We wtyczce PVS-Studio dla Visual Studio odbywa się to poprzez filtrowanie według poziomów i kategorii błędów. Aby uzyskać jak najdokładniejszy wynik, pozostaw tylko Wysoki и Ogólne (również klikalne):

Analiza statyczna – od wprowadzenia do integracji
Rzeczywiście, 178 ostrzeżeń jest znacznie łatwiejszych do przeglądania niż kilka tysięcy...

W zakładkach Średni и niski Często istnieją dobre ostrzeżenia, ale te kategorie obejmują te diagnostyki, które mają mniejszą dokładność (niezawodność). Więcej informacji na temat poziomów ostrzeżeń i opcji pracy w systemie Windows można znaleźć tutaj: *płakać*.

Warto pomyślnie przejrzeć najciekawsze błędy (i skutecznie je poprawić). stłum pozostałe ostrzeżenia. Jest to konieczne, aby nowe ostrzeżenia nie zaginęły wśród starych. Ponadto analizator statyczny jest asystentem programisty, a nie listą błędów. 🙂

1. Automatyka

Po zapoznaniu się czas na konfigurację wtyczek i integrację z CI. Należy to zrobić, zanim programiści zaczną używać analizatora statycznego. Faktem jest, że programista może zapomnieć o włączeniu analizy lub w ogóle nie chcieć tego robić. Aby to zrobić, musisz wszystko ostatecznie sprawdzić, aby nieprzetestowany kod nie mógł dostać się do ogólnej gałęzi programistycznej.

Czego dowiesz się na tym etapie:

  • Jakie możliwości automatyzacji zapewnia narzędzie;
  • Czy analizator jest kompatybilny z Państwa systemem montażowym?

Ponieważ nie istnieje doskonała dokumentacja, czasami trzeba ją napisać wsparcie. Jest to normalne i chętnie Ci pomożemy. 🙂

Przejdźmy teraz do usług ciągłej integracji (CI). Można do nich bez większych problemów zaimplementować dowolny analizator. Aby to zrobić, należy utworzyć osobny etap w potoku, który zwykle znajduje się po kompilacji i testach jednostkowych. Odbywa się to za pomocą różnych narzędzi konsolowych. Na przykład PVS-Studio udostępnia następujące narzędzia:

Aby zintegrować analizę z CI, musisz zrobić trzy rzeczy:

  • Zainstaluj analizator;
  • Uruchom analizę;
  • Dostarczyć wyniki.

Na przykład, aby zainstalować PVS-Studio w systemie Linux (na platformie Debian), musisz uruchomić następujące polecenia:

wget -q -O - https://files.viva64.com/etc/pubkey.txt 
    | sudo apt-key add -
sudo wget -O /etc/apt/sources.list.d/viva64.list 
  https://files.viva64.com/etc/viva64.list
  
sudo apt-get update -qq
sudo apt-get install -qq pvs-studio

W systemach z systemem Windows nie ma możliwości zainstalowania analizatora z menedżera pakietów, ale możliwe jest wdrożenie analizatora z wiersza poleceń:

PVS-Studio_setup.exe /verysilent /suppressmsgboxes 
/norestart /nocloseapplications

Możesz przeczytać więcej o wdrażaniu PVS-Studio na systemach z systemem Windows *tutaj*.

Po instalacji należy bezpośrednio przeprowadzić analizę. Zaleca się jednak wykonanie tej czynności dopiero po zakończeniu kompilacji i testów. Dzieje się tak, ponieważ analiza statyczna trwa zwykle dwa razy dłużej niż kompilacja.

Ponieważ metoda uruchamiania zależy od platformy i cech projektu, jako przykład pokażę opcję dla C++ (Linux):

pvs-studio-analyzer analyze -j8 
                            -o PVS-Studio.log
plog-converter -t errorfile PVS-Studio.log --cerr -w

Pierwsze polecenie wykona analizę, a drugie kopertykonwertuje raport do formatu tekstowego, wyświetla go na ekranie i zwraca kod powrotu inny niż 0 w przypadku wystąpienia ostrzeżeń. Tego rodzaju mechanizmu można wygodnie używać do blokowania kompilacji w przypadku pojawienia się komunikatów o błędach. Zawsze jednak możesz usunąć flagę -w i nie blokuj zestawu zawierającego ostrzeżenia.

Uwaga. Format tekstu jest niewygodny. Podano to jedynie jako przykład. Zwróć uwagę na ciekawszy format raportu - FullHtml. Umożliwia poruszanie się po kodzie.

Więcej o konfigurowaniu analizy na CI przeczytasz w artykule „PVS-Studio i ciągła integracja„ (Windows) lub „Jak skonfigurować PVS-Studio w Travis CI" (Linux).

OK, skonfigurowałeś analizator na serwerze kompilacji. Teraz, jeśli ktoś przesłał nieprzetestowany kod, etap weryfikacji zakończy się niepowodzeniem i będziesz mógł wykryć problem, jednak nie jest to do końca wygodne, ponieważ bardziej efektywne jest sprawdzenie projektu nie po połączeniu oddziałów, ale przed nim, na etapie pull request.

Ogólnie rzecz biorąc, skonfigurowanie analizy pull requestu nie różni się zbytnio od zwykłego uruchomienia analizy CI. Z wyjątkiem konieczności uzyskania listy zmienionych plików. Zwykle można je uzyskać, sprawdzając różnice między gałęziami za pomocą git:

git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list

Teraz musisz przekazać tę listę plików do analizatora jako dane wejściowe. Na przykład w PVS-Studio jest to realizowane za pomocą flagi -S:

pvs-studio-analyzer analyze -j8 
                            -o PVS-Studio.log 
                            -S .pvs-pr.list

Możesz dowiedzieć się więcej o analizowaniu żądań ściągnięcia *tutaj*. Nawet jeśli Twojego CI nie ma na liście usług wymienionych w artykule, przydatna będzie część ogólna poświęcona teorii tego typu analiz.

Konfigurując analizę żądań ściągnięcia, możesz blokować zatwierdzenia zawierające ostrzeżenia, tworząc w ten sposób granicę, której nieprzetestowany kod nie może przekroczyć.

Wszystko to z pewnością jest dobre, ale chciałbym móc zobaczyć wszystkie ostrzeżenia w jednym miejscu. Nie tylko z analizatora statycznego, ale także z testów jednostkowych lub z analizatora dynamicznego. Istnieją do tego różne usługi i wtyczki. Na przykład PVS-Studio ma wtyczka do integracji z SonarQube.

2. Integracja na maszynach deweloperskich

Teraz przyszedł czas na instalację i konfigurację analizatora do codziennego użytku programistycznego. W tym momencie znasz już większość sposobów pracy, więc można to nazwać najłatwiejszą częścią.

W najprostszej opcji programiści mogą samodzielnie zainstalować niezbędny analizator. Zajmie to jednak dużo czasu i odwróci uwagę od programowania, dlatego możesz zautomatyzować ten proces za pomocą instalatora i niezbędnych flag. W przypadku PVS-Studio są różne flagi do automatycznej instalacji. Jednak zawsze istnieją menedżery pakietów, na przykład Chocolatey (Windows), Homebrew (macOS) lub dziesiątki opcji dla Linuksa.

Następnie będziesz musiał zainstalować niezbędne wtyczki, np visual Studio, IDEA, Jeździec itd.

3. Codzienne użytkowanie

Na tym etapie czas powiedzieć kilka słów o sposobach na przyspieszenie analizatora podczas codziennego użytkowania. Pełna analiza całego projektu zajmuje dużo czasu, ale jak często zmieniamy kod w całym projekcie na raz? Nie ma prawie żadnej refaktoryzacji, która byłaby tak duża, aby natychmiast miała wpływ na całą bazę kodu. Liczba zmienianych jednorazowo plików rzadko przekracza kilkanaście, dlatego warto je analizować. Dla takiej sytuacji istnieje tryb analizy przyrostowej. Tylko nie przejmuj się, to nie jest kolejne narzędzie. Jest to specjalny tryb, który pozwala analizować tylko zmienione pliki i ich zależności, a dzieje się to automatycznie po kompilacji, jeśli pracujesz w IDE z zainstalowaną wtyczką.

Jeśli analizator wykryje problemy w ostatnio zmienionym kodzie, niezależnie zgłosi to. Przykładowo PVS-Studio poinformuje Cię o tym za pomocą alertu:

Analiza statyczna – od wprowadzenia do integracji
Oczywiście nakazanie programistom korzystania z narzędzia nie wystarczy. Musimy im jakoś powiedzieć, co to jest i jak jest. Tutaj znajdują się na przykład artykuły dotyczące szybkiego uruchomienia PVS-Studio, ale możesz znaleźć podobne samouczki dotyczące dowolnego preferowanego narzędzia:

Artykuły takie dostarczają wszelkich informacji niezbędnych w codziennym użytkowaniu i nie zajmują dużo czasu. 🙂

Już na etapie poznawania narzędzia, podczas jednego z pierwszych uruchomień, stłumiliśmy wiele ostrzeżeń. Niestety analizatory statyczne nie są doskonałe, więc od czasu do czasu dają fałszywe alarmy. Zwykle łatwo jest je ukryć; na przykład we wtyczce PVS-Studio dla Visual Studio wystarczy kliknąć jeden przycisk:

Analiza statyczna – od wprowadzenia do integracji
Możesz jednak zrobić więcej, niż tylko je stłumić. Możesz na przykład zgłosić problem do działu wsparcia. Jeśli uda się poprawić fałszywy alarm, w przyszłych aktualizacjach możesz zauważyć, że za każdym razem będzie coraz mniej fałszywych alarmów specyficznych dla twojej bazy kodu.

Pozostałe integracje

Przeszliśmy więc przez wszystkie etapy włączania analizy statycznej do procesu rozwoju. Pomimo tego, jak ważne jest skonfigurowanie takich narzędzi w CI, najważniejszym miejscem do ich uruchomienia jest komputer programisty. W końcu analizator statyczny nie jest sędzią, który gdzieś daleko od ciebie powie, że kod jest kiepski. Wręcz przeciwnie, jest to asystent, który powie Ci, jeśli jesteś zmęczony i przypomni, jeśli o czymś zapomniałeś.

To prawda, że ​​​​bez regularnego stosowania analiza statyczna raczej nie uprości znacząco programowania. W końcu jego główna korzyść dla programisty polega nie tyle na wyszukiwaniu skomplikowanych i kontrowersyjnych fragmentów kodu, ile na ich wczesnym wykrywaniu. Zgadzam się, że wykrycie problemu po przesłaniu zmian do testowania jest nie tylko nieprzyjemne, ale także bardzo czasochłonne. Regularnie stosowana analiza statyczna sprawdza każdą zmianę bezpośrednio na Twoim komputerze i raportuje podejrzane miejsca podczas pracy nad kodem.

A jeśli Ty lub Twoi współpracownicy nadal nie jesteście pewni, czy warto wdrożyć analizator, to sugeruję już teraz zacząć czytać artykuł „Powody wprowadzenia statycznego analizatora kodu PVS-Studio do procesu rozwoju„. Rozwiązuje typowe obawy programistów, że analiza statyczna zajmie im czas i tak dalej.

Analiza statyczna – od wprowadzenia do integracji

Jeśli chcesz udostępnić ten artykuł anglojęzycznej publiczności, skorzystaj z linku do tłumaczenia: Maxim Zwiagincew. Analiza statyczna: od rozpoczęcia do integracji.

Źródło: www.habr.com

Dodaj komentarz