03 Marzec 2016

Phan – statyczny analizator PHP

php programowanie software development

Autor: Tomasz Tybulewicz

Phan – statyczny analizator PHP

AST

Wśród wielu nowości w PHP 7 pojawiło się też ASTabstrakcyjne drzewo składni które jest wykorzystywane wewnątrz języka do analizy składni. Po doinstalowaniu rozszerzenia php-ast, drzewo to jest dostępne również dla kodu PHP w Twojej aplikacji. Właśnie z tego korzysta Phan podczas analizy kodu.

Phan

W listopadzie 2014 Rasmus Lerdorf ogłosił rozpoczęcie prac nad nowym analizatorem statycznym wykorzystującym AST, pół roku później pokazał wersję „proof of concept” która po upływie następnych 6 miesięcy została przejęta i przepisana przez Andrew Morrisona (współpracownika Rasmusa w Etsy). Od tego czasu Andrew rozwija kod udostępniony na GitHub i przygotowuje się do wypuszczenia pierwszej stabilnej wersji.

Użycie Phan w projekcie

Podczas analizy Phan znajduje wiele różnych typów błędów – poza „normalnymi” błędami składni znajduje też prawdopodobne pomyłki programisty. Takie błędy które są poprawnym kodem PHP, ale zachodzi podejrzenie że intencje programisty były inne niż te które zostały zaprogramowane. Obszerny opis wykrywanych pomyłek można znaleźć na odpowiedniej stronie projektu, ale żeby zgłaszane błędy miały sens trzeba trochę się przygotować.

Spróbujmy sprawdzić tę klasę:

Dostajemy listę błędów:

Pierwsze dwa błędy oznaczają że Phan nie zna klasy Uuid do której odwołujemy się w kodzie, wystarczy dodać odpowiednie pliki do analizy:

Parametr -l dodaje katalog vendor do listy analizowanych plików.

Uuups, cała masa błędów w załączonej bibliotece, trzeba ją wykluczyć z analizy:

Kolejny parametr: -3 to lista katalogów które nie będą analizowane pod względem poprawności, tym razem wynik jest zgodny z planem:

Co w końcu znajduje oczekiwany problem – niezgodność deklaracji PhpDoc z działaniem metody.

Optymalizacja Phan

Dodanie całego katalogu vendors do parsowania jest bardzo wygodne, ale przy ciut większych projektach wydłuża czas analizy oraz zwiększa apetyt na pamięć (w moich testach doszedłem do 30s analizy i 2GB pamięci).

Skorzystałem z możliwości pliku konfiguracyjnego Phan (domyślna lokalizacja to .phan/config.php) – wszystkie możliwe ustawienia są opisane w pliku Config.php, ja potrzebowałem trzech ustawień:

W tym przykładzie do analizy dodałem cały katalog src, ze sprawdzania poprawności wyłączyłem vendors/ oraz dodałem do parsowania 90 plików (w większości z katalogu vendors). Dzięki tej konfiguracji czas badania źródeł projektu spadł do 2 sekund. Co jakiś czas (przy odwołaniu się do nowego interface’u) trzeba dodać kolejne pliki do file_list ale jesteśmy gotowi na taki obowiązek.

Podsumowanie

Phan jest u nas kolejnym narzędziem którym badamy kod, cenimy w nim to że znajduje problemy pomijane przez pozostałe narzędzia (choćby wspomniana analiza PhpDoc).

Phan jest dynamicznie rozwijany i dopier zbliża się do pierwszej stabilnej wersji, oznacza to że często najnowszy kod (z gałęzi master) nie działa tak jak trzeba – po aktualizacji pojawiają się fałszywe błędy w kodzie które są wynikiem pomyłki w Phan. Na szczęście developerzy projektu szybko reagują na zgłoszenia błędów i w ciągu jednego dnia poprawiają zgłoszone usterki.

Po osiągnięciu dojrzałości projektu, Phan będzie bardzo dobrym uzupełnieniem narzędzi wspierających CI oraz przeglądy kodu, w tej chwili używamy go „ręcznie” analizując kod przed dodaniem do repozytorium.

Linki

We like cookies... and we use them.

In order to improve our service, we use cookies. You can block them by changing your browser settings.