Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: statyczna analiza kodu
Forum PHP.pl > Forum > PHP
jaTroll
Witam wszystkich

Szukałem ostatnio jakiegoś narzędzia do statycznej analizy kodu, w szczególności zależy mi na detekcji kilku "konstrukcji" które w 99% wypadków są wynikiem błędu np:

* $$zmienna
* $obj->$pole
* $obj = new Object(), ale Object.php nie był zainkludowany
* ostrzerzenie o użyciu lokalnej zmiennej, która nie została zainicjowana

Znalazłem takie narzędzie: http://pear.php.net/manual/en/package.php....codesniffer.php. Problem w tym, że przynajmniej w podstawowej wersji, sprawdza zgodność ze standardami kodowania typu, czy każda funkcja poprzedzona jest dokiem. Dla mnie to trochę za mało. Prawdopodobnie część z rzeczy o które mi chodzi da się załatwić pisząc wtyczkę do tego narzędzia, ale może istnieje coś z czym będzie mniej problemów.

Czy ktoś słyszał albo miał styczność z takim narzędziem?
Crozin
Możesz mieć poważny problem ze znalezieniem takiego narzędzia bo:
1. Pierwsze dwa punkty są w pełni poprawnym kodem PHP.
2. Poprawność dwóch ostatnich da się sprawdzić dopiero w czasie wykonywania:
  1. $a = 'd';
  2. $$a = 'c';
  3.  
  4. echo $d; // dopiero w czasie wykonywania można określić istnienie tej zmiennej
  5.  
  6. // ---------
  7.  
  8. $inc = /* pobierz skądś wartość "Object" */;
  9. require '..../libs/' . $inc . '.php';
  10. $obj = new Object(); // dopiero w czasie wykonywania można określić istnienie klasy Object
A wszystkie tego typu narzędzia dadzą Ci informacje o błędzie jedynie w przypadku, gdy są one tego pewne.
jaTroll
Wiem, że 1,2 są poprawne tak samo jak konstrukcja

  1. function foo()
  2. {
  3. echo "hello";
  4. }


ale można sobie wyobrazic narzędzie które stwierdzi, że otwierająca klamerka nie powinna byc w nowej linii i wyrzuci warninga. Tak samo mogło by ostrzegac przed $$var. Kwestia przyjęcia standardów.

Jeżeli chodzi o detekcje klasy to przyjmując założenie, że wszystkie użyte include będą odwoływały się do statycznych ścieżek, jesteś w stanie stwierdzic, czy dana klasa będzie zadeklarowana, czy nie. Mając skrypt podążasz za includami i przy każdym wystąpieniu new [nazwa klasy]() sprawdzasz, czy taka klasa była wcześniej zadeklarowana.

Analogicznie można by wykrywac użycie niezainicjowanej zmiennej.

Problem z testowaniem przez wykonywanie jest taki, że często podczas wykonywania skryptu nie przechodzisz przez cały kod. W takim wypadku może się okazac, że coś nie działa w nieoczekiwanym momencie. Jedyną skuteczną metodą radzenia sobie z tym są testy jednostkowe, ale wiadomo, że nie zawsze się je pisze i nie zawsze pokrycie jest 100%.
Crozin
Niczego nie dam sobie za to uciąć, ale raczej nie istnienie nic gotowego co by spełniało Twoje oczekiwania. Potrzebujesz wykryć "brzydkie praktyki", a PHP-owskie narzędzia nadal mają problem z wykrywaniem błędów. wink.gif

1. Część problemów mógłby chyba rozwiązać tokenizer PHP, który wykrywa takie rzeczy jak zmienne zmiennych czy dynamiczne odwoływanie się do nazwy właściwości (przypadki #1 i #2).
2. Jednak tak na prawdę testy jednostkowe to tutaj najłatwiejsze i najstabilniejsze rozwiązanie. Zresztą takie błędy raczej skutkować będą fatal errorami, więc szybko da się je wyłapać ([nie]stety).
jaTroll
A jednak coś znalazłem:

http://www.sonarsource.org/

z wtyczką do PHP

http://docs.codehaus.org/display/SONAR/PHP+Plugin

Nie spełnia to w prawdzie wszystkich moich oczekiwań, ale część tak. W każdym razie polecam
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.