Jak przeprowadzić statyczną analizę kodu w php? [Zamknięte]

465

Czy istnieje narzędzie do analizy statycznej plików źródłowych PHP? Sam plik binarny może sprawdzać błędy składniowe, ale szukam czegoś, co robi więcej, na przykład:

  • nieużywane przypisania zmiennych
  • tablice, które są przypisywane bez inicjowania jako pierwsze
  • i ewentualnie ostrzeżenia w stylu kodu
  • ...
Eswald
źródło
57
Righty-o: zamknięte przez SO, kiedy wyraźnie taka odpowiedź jest niezwykle przydatna.
Ira Baxter,
3
Zgodzić się. To pytanie jest kluczowe. php lint (plik php -l) nie zapewnia drugiej połowy: uruchom autoload, upewnij się, że istnieje funkcja o nazwie, że istnieją zmienne, istnieją właściwości obiektu. itp.
Maks.
6
@IraBaxter przydatne, ale nie, ściśle mówiąc, na temat. softwarerecs.stackexchange.com to prawdopodobnie bardziej tematyczna lokalizacja. Oczywiście ironia polega na tym, że o wiele więcej programistów zna SO niż rodzeństwo ...
Wayne Werner
7
Fakt, że tak wielu ludzi uważa, że ​​tego typu pytania są przydatne, prawdopodobnie właśnie teraz istnieje oprogramowanie. Z pewnością wydawało się to tematem wstecz, gdy była to jedyna strona wymiany stosów. Teraz, gdy jest na to jasne miejsce, czy migracja ma sens?
eswald
4
Zamknięte z powodu zamykających z przyjemnością uruchamiających. Bah!
Roadowl

Odpowiedzi:

356

Uruchom php w trybie lint z wiersza poleceń, aby sprawdzić poprawność składni bez wykonania:

php -l FILENAME

Analizatory statyczne wyższego poziomu obejmują:

Analizatory niższego poziomu obejmują:

Analizatory środowiska wykonawczego, które są bardziej przydatne w niektórych przypadkach ze względu na dynamiczny charakter PHP, obejmują:

Biblioteki dokumentacji phpdoc i doxygen wykonują rodzaj analizy kodu. Na przykład Doxygen można skonfigurować tak, aby renderował ładne wykresy dziedziczenia za pomocą graphviz .

Inną opcją jest xhprof , który jest podobny do xdebug, ale lżejszy, co czyni go odpowiednim dla serwerów produkcyjnych. Narzędzie zawiera interfejs oparty na PHP.

troelskn
źródło
20
+1 za poświęcenie 6 godzin mojego życia na wypróbowanie wszystkich tych gadżetów!
Abe Petrillo
14
@dimitko: To dlatego, że php -lmożna odczytać tylko jeden plik wejściowy na raz (to znaczy, że nie zadziała, jeśli to zrobisz php -l file1.php file2.php). Zamiast tego musisz użyć -n 1opcji, która mówi, xargsaby użyć tylko jednego wiersza wejściowego na proces polecenia. To zamiast tego spowoduje, że uruchomi php -l file1.phpsię php -l file2.phposobno. W tym samym czasie możesz użyć -P <n>do uruchomienia procesów „n” jednocześnie, aby zrównoważyć wykonanie:find . -name '*.inc' -o -name '*.php' -print0 | xargs -0 -n1 -P10 php -l
Joe
11
find /your/path -name '*.php' -exec php -l {} \;działa niezawodnie.
Koen.
11
Uwaga : Aby wbudowana funkcja lint ( php -l) działała, musisz ją ustawić, display_errors = onw php.iniprzeciwnym razie pojawi się tylko ogólny komunikat o błędach składniowych, ale nie będzie żadnych szczegółów na temat tego, jakie błędy lub jakie linie.
Synetech
8
Synetech - Dobry. Możesz jednak zmienić ustawienie w wierszu poleceń, używając -dprzełącznika. Np.php -l -d display_errors=on $FILENAME
troelskn
24

PHP Mess Detector jest niesamowity i szybki.

aredridel
źródło
7
Dziękuję Ci! Szukałem niesamowitego. W rzeczywistości nie chcę używać niczego oprócz niesamowitych narzędzi. :)
Umowa prof. Falkena została naruszona
1
To początek i wydaje się, że używa tego Netbeans, ale nie ufałbym mu całkowicie. Niektóre z jego opcji są po prostu dziwne („ostrzegasz”, jeśli używasz instrukcji else?), A w jego wykrywaniu jest wiele dużych błędów, które nawet nie otrzymały odpowiedzi od programistów: github.com/phpmd / phpmd / Issues
NoBugs
inaczej dodaje cykliczną złożoność i często można go pisać inaczej, aby tego uniknąć. np. if (true) {$ x = 1; } else {$ x = 2; } można ponownie zapisać: $ x = 2; if (true) {$ x = 1; }
RichardAtHome
17

Próbowałem użyć $ php -l i kilku innych narzędzi. Jednak najlepszym z moich doświadczeń (oczywiście YMMV) jest sprawdzenie zestawu narzędzi pfff . Słyszałem o pfff na Quora ( http://www.quora.com/Is-there-a-good-PHP-lint-static-analysis-tool )

Możesz go skompilować i zainstalować. Nie ma ładnych pakietów (w moim miętowym Debianie musiałem najpierw zainstalować zależności libpcre3-dev, ocaml, libcairo-dev, libgtk-3-dev i libgimp2.0-dev), ale powinno być warte instalacji.

Wyniki są zgłaszane jak

rjha@mint ~ $ ~/sw/pfff/scheck ~/code/github/sc/
login-now.php:7:4: CHECK: Unused Local variable $title
go-automatic.php:14:77: CHECK: Use of undeclared variable $goUrl.
rjha94
źródło
Dziękuję Ci. Ciągle narzeka na nasz dynamiczny import, ale jak dotąd jego inne możliwości wyglądają dobrze. Musiałem także zainstalować binutils-gold, a scheck musiałem zainstalować w niestandardowej ścieżce, ale wydaje się, że teraz działa.
eswald
1
@eswald Teraz dni jestem konwerterem wykrywacza bałaganu php (phpmd). Ze wszystkich narzędzi, które wypróbowałem do tej pory (sniffer kodu php, scheck, php -l, phpmd), IMHO, phpmd działa najlepiej w moim przypadku.
rjha94
Czy wiesz, gdzie znaleźć Scheck?
George Katsanos
1
@GeorgeKatsanos scheck jest częścią zestawu narzędzi pfff. github.com/facebook/pfff
rjha94
2
Scheck zawsze daje mi błąd „php checker potrzebuje pliku wykresu”. W większości nieistniejąca dokumentacja nie ma przykładów.
Robert Bruce
14

Zobacz CloneDR Semantic Designs, narzędzie do „wykrywania klonowania”, które znajduje kopiowanie / wklejanie / edytowanie kodu. Wyszukuje dokładne i prawie brakujące fragmenty kodu, pomimo białych znaków, komentarzy, a nawet zmiennych nazw. Przykładowy raport z wykrycia dla PHP można znaleźć na stronie wesite. (Jestem autorem).

Ira Baxter
źródło
1
Patrząc na stronę, wydaje się to niesamowitym narzędziem. Przyjrzę się bliżej później! Dzięki za link (+1 również za „Jestem autorem”)
Eric Cope
Zmora każdego przenikliwego studenta.
wom
7

IDE NetBeans sprawdza błędy składniowe, nieużywane zmienne i tym podobne. Nie jest zautomatyzowany, ale działa dobrze w przypadku małych i średnich projektów.

slikts
źródło
6

Istnieje nowe narzędzie o nazwie nWire dla PHP . Jest to wtyczka do eksploracji kodu dla Eclipse PDT i Zend Studio 7.x. Umożliwia analizę kodu w czasie rzeczywistym dla PHP i udostępnia następujące narzędzia:

  • Wizualizacja kodu - interaktywna graficzna reprezentacja komponentów i skojarzeń.
  • Nawigacja po kodzie - unikalny widok nawigacji pokazuje wszystkie skojarzenia i współpracuje z tobą podczas pisania lub czytania kodu.
  • Szybkie wyszukiwanie - szukaj w trakcie pisania metod, pól, plików itp.
zvikico
źródło
1
to nie jest odpowiedź na pytanie. jak odpowiedź istnieją fasolki szparagowe itp.
Yosef
5

PHP PMD (wykrywacz bałaganu w projekcie) i PHP CPD (wykrywacz wklejania kopii) jako poprzednia część PHPUnit

erenon
źródło
4

Istnieje RIPS - statyczny analizator kodu źródłowego pod kątem luk w skryptach PHP . Źródła RIPS dostępne na SourceForge .

Ze strony RIPS:

RIPS to narzędzie napisane w PHP do wyszukiwania luk w aplikacjach PHP za pomocą statycznej analizy kodu. Tokenizując i parsując wszystkie pliki kodu źródłowego, RIPS jest w stanie przekształcić kod źródłowy PHP w model programu i wykryć wrażliwe ujścia (potencjalnie wrażliwe funkcje), które mogą zostać skażone przez dane wejściowe użytkownika (na które wpływa złośliwy użytkownik) podczas przepływu programu. Oprócz uporządkowanych danych wyjściowych znalezionych luk, RIPS oferuje również zintegrowaną platformę audytu kodu do dalszej ręcznej analizy.

SteAp
źródło
RIPS to projekt na wpół martwy i działa tylko z kodem php innym niż OOP.
alexglue
3

Jest absolutnie nowe narzędzie do analizy kodu statycznego o nazwie PHP Analyzer .

Wśród wielu rodzajów analizy statycznej zapewnia również podstawową funkcję automatycznego ustawiania, patrz dokumentacja .

AKTUALIZACJA: PHP-Analyzer jest już przestarzałym projektem, ale nadal można uzyskać do niego dostęp w starszej gałęzi

fatganz
źródło
2

Możesz spróbować skompilować z hiphopem na Facebooku.

Przeprowadza analizę statyczną całego projektu i może być tym, czego szukasz.

https://github.com/facebook/hiphop-php

Martin Konecny
źródło