Wie führe ich eine statische Code-Analyse in PHP durch? [geschlossen]


466

Gibt es ein statisches Analysetool für PHP-Quelldateien? Die Binärdatei selbst kann nach Syntaxfehlern suchen, aber ich suche nach etwas, das mehr kann, wie:

  • nicht verwendete Variablenzuweisungen
  • Arrays, die zugewiesen werden, ohne zuvor initialisiert zu werden
  • und möglicherweise Warnungen im Codestil
  • ...

57
Righty-o: von SO geschlossen, wenn diese Art der Antwort eindeutig unglaublich nützlich ist.
Ira Baxter

3
zustimmen. Diese Frage ist entscheidend. php lint (php -l Datei) kann die andere Hälfte nicht bereitstellen: Führen Sie das Autoload aus, stellen Sie sicher, dass eine aufgerufene Funktion vorhanden ist, dass Variablen vorhanden sind und Objekteigenschaften vorhanden sind. usw.
Max

6
@IraBaxter nützlich, aber streng genommen nicht zum Thema. softwarerecs.stackexchange.com ist wahrscheinlich ein themenbezogener Ort. Die Ironie hier ist natürlich, dass SO viel mehr Entwickler mit SO vertraut sind als mit Geschwistern ...
Wayne Werner

7
Die Tatsache, dass so viele Menschen diese Art von Frage nützlich finden, ist wahrscheinlich der Grund, warum es jetzt Software gibt. Es schien sicherlich ein Thema zu sein, als dies die einzige Stack-Exchange-Site war. Ist es nun sinnvoll, zu migrieren, da es einen klaren Ort dafür gibt?
Eswald

4
Wegen triggerfreudiger Schließer geschlossen. Bah!
Roadowl

Antworten:


356

Führen Sie PHP im Lint-Modus über die Befehlszeile aus, um die Syntax ohne Ausführung zu überprüfen:

php -l FILENAME

Übergeordnete statische Analysegeräte umfassen:

Untergeordnete Analysegeräte umfassen:

Zu den Laufzeitanalysatoren, die aufgrund der Dynamik von PHPs für einige Dinge nützlicher sind, gehören:

Die Dokumentationsbibliotheken phpdoc und doxygen führen eine Art Code-Analyse durch. Doxygen kann beispielsweise so konfiguriert werden, dass mit graphviz schöne Vererbungsdiagramme gerendert werden .

Eine weitere Option ist xhprof , das xdebug ähnelt, jedoch leichter ist und sich daher für Produktionsserver eignet. Das Tool enthält eine PHP-basierte Schnittstelle.


20
+1 für 6 Stunden meines Lebens, um all diese Leckereien auszuprobieren!
Abe Petrillo

14
@dimitko: Das liegt daran, dass php -limmer nur eine Eingabedatei gleichzeitig gelesen werden kann (das heißt, es funktioniert nicht, wenn Sie dies tun php -l file1.php file2.php). Stattdessen müssen Sie die -n 1Option verwenden, die angibt xargs, dass nur eine Eingabezeile pro Befehlsprozess verwendet werden soll. Dadurch wird es stattdessen ausgeführt, php -l file1.phpgefolgt von php -l file2.phpseparat. Gleichzeitig können Sie -P <n>"n" Prozesse gleichzeitig ausführen, um die Ausführung zu parallelisieren:find . -name '*.inc' -o -name '*.php' -print0 | xargs -0 -n1 -P10 php -l
Joe

11
find /your/path -name '*.php' -exec php -l {} \;arbeitet zuverlässig.
Koen.

11
NB : Für die Einbau-Fussel - Funktion ( php -l) zu arbeiten, Sie setzen müssen display_errors = onin php.ini, sonst werden Sie nur eine allgemeine Meldung über dort seinen Syntaxfehler aber keine näheren Angaben darüber , welche Fehler (n) oder , was Linie (n).
Synetech

8
Synetech - Gut. Sie können die Einstellung in der Befehlszeile jedoch mit dem -dSchalter überschreiben . ZBphp -l -d display_errors=on $FILENAME
troelskn



24

PHP Mess Detector ist fantastisch und schnell.


7
Vielen Dank! Ich war auf der Suche nach einem fantastischen. Tatsächlich lehne ich es ab, alles andere als großartige Werkzeuge zu verwenden. :)
Prof. Falken Vertrag verletzt

1
Es ist ein Anfang, und es scheint das zu sein, was Netbeans verwendet, aber ich würde ihm nicht ganz vertrauen. Einige seiner Optionen sind einfach seltsam ("Warnung", wenn Sie eine else-Anweisung verwenden?), Und es gibt zahlreiche große Fehler in den Erkennungen, auf die die Entwickler noch nicht einmal geantwortet haben
NoBugs

sonst fügt zyklomatische Komplexität hinzu und kann oft anders geschrieben werden, um und sonst zu vermeiden. zB wenn (wahr) {$ x = 1; } else {$ x = 2; } kann neu geschrieben werden: $ x = 2; if (true) {$ x = 1; }
RichardAtHome

17

Ich habe versucht, $ php -l und einige andere Tools zu verwenden. Das beste meiner Erfahrung (YMMV natürlich) ist jedoch Scheck of Pfff Toolset . Ich habe auf pora von pfff gehört ( http://www.quora.com/Is-there-a-good-PHP-lint-static-analysis-tool )

Sie können es kompilieren und installieren. Es gibt keine netten Pakete (auf meinem Mint-Debian musste ich zuerst die Abhängigkeiten libpcre3-dev, ocaml, libcairo-dev, libgtk-3-dev und libgimp2.0-dev installieren), aber es sollte einen Gesamtwert wert sein.

Die Ergebnisse werden wie berichtet

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.

Vielen Dank. Es beschwert sich immer wieder über unsere dynamischen Importe, aber seine anderen Funktionen sehen bisher gut aus. Ich musste auch binutils-gold installieren und scheck musste in einem benutzerdefinierten Pfad installiert werden, aber es scheint jetzt zu funktionieren.
Eswald

1
@eswald Heute bin ich ein PHP Mess Detector (PHMD) konvertieren. Von allen Tools, die ich bisher ausprobiert habe (PHP-Code-Sniffer, Scheck, PHP-1, PHpmD), funktioniert PHMO meiner Meinung nach am besten für meinen Fall.
rjha94

Wissen Sie, wo Sie Scheck finden?
George Katsanos

1
@ GeorgeKatsanos scheck ist Teil des pfff-Toolset. github.com/facebook/pfff
rjha94

2
Scheck gibt mir immer den Fehler "PHP Checker braucht eine Grafikdatei". Die meist nicht vorhandene Dokumentation enthält keine Beispiele.
Robert Bruce

14

Siehe CloneDR von Semantic Designs , ein Tool zur "Klonerkennung ", das Code zum Kopieren / Einfügen / Bearbeiten findet. Es wird trotz Leerzeichen, Kommentaren und sogar variablen Umbenennungen genaue und nahezu fehlerhafte Codefragmente finden. Ein Beispielerkennungsbericht für PHP finden Sie auf der Website. (Ich bin der Autor).


1
Auf der Website scheint das ein unglaubliches Werkzeug zu sein. Ich werde später genauer hinsehen! Vielen Dank für den Link (+1 für "Ich bin der Autor")
Eric Cope

Der Fluch eines vernünftigen Studenten.
Frau

7

Die NetBeans-IDE sucht nach Syntaxfehlern, nicht verwendeten Variablen und dergleichen. Es ist nicht automatisiert, funktioniert aber gut für kleine oder mittlere Projekte.


6

Es gibt ein neues Tool namens nWire für PHP . Es ist ein Code Exploration Plugin für Eclipse PDT und Zend Studio 7.x. Es ermöglicht die Echtzeit-Code-Analyse für PHP und bietet die folgenden Tools:

  • Code-Visualisierung - interaktive grafische Darstellung von Komponenten und Assoziationen.
  • Code-Navigation - Die einzigartige Navigationsansicht zeigt alle Zuordnungen und arbeitet mit Ihnen zusammen, während Sie Code schreiben oder lesen.
  • Schnellsuche - Suchen Sie während der Eingabe nach Methoden, Feldern, Dateien usw.

1
Es ist keine Antwort auf eine Frage. wie Antwort exist Netbeans etc ..
Yosef

5

PHP PMD (Project Mess Detector) und PHP CPD (Copy Paste Detector) als ehemaliger Teil von PHPUnit


4

Es gibt RIPS - einen statischen Quellcode-Analysator für Schwachstellen in PHP-Skripten . RIPS-Quellen bei SourceForge erhältlich .

Von der RIPS-Site:

RIPS ist ein in PHP geschriebenes Tool zum Auffinden von Schwachstellen in PHP-Anwendungen mithilfe der statischen Code-Analyse. Durch Tokenisieren und Parsen aller Quellcodedateien kann RIPS PHP-Quellcode in ein Programmmodell umwandeln und sensible Senken (potenziell anfällige Funktionen) erkennen, die durch Benutzereingaben (die von einem böswilligen Benutzer beeinflusst werden) während des Programmflusses beeinträchtigt werden können. Neben der strukturierten Ausgabe gefundener Schwachstellen bietet RIPS auch ein integriertes Code-Audit-Framework für die weitere manuelle Analyse.


RIPS ist ein halb totes Projekt und funktioniert nur mit Nicht-OOP-PHP-Code.
Alexglue

3

Es gibt ein absolut neues Tool für die statische Code-Analyse namens PHP Analyzer .

Neben vielen Arten der statischen Analyse bietet es auch grundlegende Funktionen zur automatischen Korrektur, siehe Dokumentation .

UPDATE: PHP-Analyzer ist jetzt ein veraltetes Projekt, aber Sie können weiterhin auf den Legacy-Zweig zugreifen


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.