Comment effectuer une analyse de code statique en php? [fermé]

466

Existe-t-il un outil d'analyse statique pour les fichiers source PHP? Le binaire lui-même peut vérifier les erreurs de syntaxe, mais je cherche quelque chose qui en fait plus, comme:

  • affectations de variables inutilisées
  • tableaux qui sont affectés à sans être initialisés en premier
  • et éventuellement des avertissements de style de code
  • ...
eswald
la source
57
Righty-o: fermé par SO, quand clairement ce type de réponse est incroyablement utile.
Ira Baxter
3
se mettre d'accord. Cette question est cruciale. php lint (fichier php -l) ne fournit pas l'autre moitié: exécutez le chargement automatique, assurez-vous qu'une fonction appelée existe, que les variables existent, que les propriétés des objets existent. etc.
Max
6
@IraBaxter utile, mais pas, à proprement parler, sur le sujet. softwarerecs.stackexchange.com est probablement un endroit plus sur le sujet. Bien sûr, l'ironie est que beaucoup plus de développeurs connaissent SO que ses frères et sœurs ...
Wayne Werner
7
Le fait que tant de gens trouvent ce type de question utile est probablement la raison pour laquelle les logiciels logiciels existent maintenant. Cela semblait certainement sur le sujet lorsque c'était le seul site d'échange de pile. Maintenant qu'il y a une place claire pour cela, est-il judicieux de migrer?
eswald
4
Fermé en raison de fermetures déclenchées. Bah!
Roadowl

Réponses:

356

Exécutez php en mode lint à partir de la ligne de commande pour valider la syntaxe sans exécution:

php -l FILENAME

Les analyseurs statiques de niveau supérieur comprennent:

Les analyseurs de niveau inférieur comprennent:

Les analyseurs d'exécution, qui sont plus utiles pour certaines choses en raison de la nature dynamique des PHP, incluent:

Les bibliothèques de documentation phpdoc et doxygen effectuent une sorte d'analyse de code. Doxygen, par exemple, peut être configuré pour afficher de jolis graphes d'héritage avec graphviz .

Une autre option est xhprof , qui est similaire à xdebug, mais plus léger, ce qui le rend approprié pour les serveurs de production. L'outil comprend une interface basée sur PHP.

troelskn
la source
20
+1 pour avoir pris 6 heures de ma vie à essayer tous ces goodies!
Abe Petrillo
14
@dimitko: C'est parce que php -lne peut lire qu'un seul fichier d'entrée à la fois (c'est-à-dire que cela ne fonctionnera pas si vous le faites php -l file1.php file2.php). Au lieu de cela, vous devez utiliser l' -n 1option, qui indique xargsde n'utiliser qu'une seule ligne d'entrée par processus de commande. Au lieu de cela, il s'exécutera php -l file1.phpsuivi de php -l file2.php, séparément. En même temps, vous pouvez utiliser -P <n>pour exécuter "n" processus à la fois, afin de paralléliser l'exécution:find . -name '*.inc' -o -name '*.php' -print0 | xargs -0 -n1 -P10 php -l
Joe
11
find /your/path -name '*.php' -exec php -l {} \;fonctionne fiable.
Koen.
11
NB : Pour la fonction intégrée à Lint ( php -l) au travail, vous devez définir display_errors = ondans php.ini, sinon vous ne recevrez qu'un message générique au sujet il y a des erreurs étant de syntaxe , mais pas de détails sur ce que l' erreur (s) ou quelle ligne (s).
Synetech
8
Synetech - Bien. Vous pouvez cependant remplacer le paramètre sur la ligne de commande à l'aide du -dcommutateur. Par exemplephp -l -d display_errors=on $FILENAME
troelskn
24

PHP Mess Detector est génial et rapide.

aredridel
la source
7
Je vous remercie! Je cherchais un super. En fait, je refuse d'utiliser autre chose que des outils impressionnants. :)
contrat du professeur Falken a été rompu
1
C'est un début, et cela semble être ce que Netbeans utilise, mais je ne lui ferais pas entièrement confiance. Certaines de ses options sont tout simplement bizarres ("vous avertir" si vous utilisez une instruction else ??), et il y a de nombreux gros bugs dans ses détections, qui n'ont même pas eu de réponse des développeurs: github.com/phpmd / phpmd / issues
NoBugs
else ajoute une complexité cyclomatique et peut souvent être écrit différemment pour éviter et sinon. par exemple, si (vrai) {$ x = 1; } else {$ x = 2; } peut être réécrit: $ x = 2; si (vrai) {$ x = 1; }
RichardAtHome
17

J'ai essayé d'utiliser $ php -l et quelques autres outils. Cependant, le meilleur de mon expérience (YMMV, bien sûr) est scheck du jeu d'outils pfff . J'ai entendu parler de pfff sur Quora ( http://www.quora.com/Is-there-a-good-PHP-lint-static-analysis-tool )

Vous pouvez le compiler et l'installer. Il n'y a pas de bons packages (sur ma Debian à la menthe, j'ai dû installer libpcre3-dev, ocaml, libcairo-dev, libgtk-3-dev et libgimp2.0-dev en premier) mais cela devrait valoir la peine d'être intégré.

Les résultats sont rapportés comme

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
la source
Je vous remercie. Il continue de se plaindre de nos importations dynamiques, mais ses autres capacités semblent bonnes jusqu'à présent. J'ai également dû installer binutils-gold, et scheck devait être installé dans un chemin personnalisé, mais cela semble fonctionner maintenant.
eswald
1
@eswald Maintenant, quelques jours, je suis un convertisseur de détecteur de dégâts php (phpmd). De tous les outils que j'ai essayés jusqu'à présent (renifleur de code php, scheck, php -l, phpmd), à mon humble avis, phpmd fonctionne le mieux pour mon cas.
rjha94
Savez-vous où trouver Scheck?
George Katsanos
1
@GeorgeKatsanos scheck fait partie du jeu d'outils pfff. github.com/facebook/pfff
rjha94
2
Scheck me donne toujours l'erreur "php checker a besoin d'un fichier graphique". La documentation pour la plupart inexistante n'a pas d'exemples.
Robert Bruce
14

Voir CloneDR de Semantic Designs , un outil de "détection de clone" qui trouve le code copier / coller / édité. Il trouvera des fragments de code exacts et presque manquants, malgré les espaces, les commentaires et même les renommages de variables. Un exemple de rapport de détection pour PHP est disponible sur le site Web. (Je suis l'auteur).

Ira Baxter
la source
1
En regardant le site, cela semble être un outil incroyable. Je regarderai de plus près plus tard! Merci pour le lien (+1 pour "Je suis l'auteur" aussi)
Eric Cope
Le fléau de tout premier cycle complice.
wom
7

L'IDE NetBeans vérifie les erreurs de syntaxe, les variables inutilisées et autres. Ce n'est pas automatisé, mais fonctionne bien pour les petits ou moyens projets.

slikts
la source
6

Il existe un nouvel outil appelé nWire pour PHP . Il s'agit d'un plugin d'exploration de code pour Eclipse PDT et Zend Studio 7.x. Il permet une analyse de code en temps réel pour PHP et fournit les outils suivants:

  • Visualisation du code - représentation graphique interactive des composants et des associations.
  • Navigation dans le code - une vue de navigation unique affiche toutes les associations et travaille avec vous pendant que vous écrivez ou lisez du code.
  • Recherche rapide - recherchez au fur et à mesure de la frappe des méthodes, des champs, des fichiers, etc.
zvikico
la source
1
ce n'est pas la réponse à la question. comme réponse existe netbeans etc.
Yosef
5

PHP PMD (détecteur de désordre du projet) et PHP CPD (détecteur de copier-coller) comme ancienne partie de PHPUnit

erenon
la source
4

Il existe RIPS - Un analyseur de code source statique pour les vulnérabilités des scripts PHP . Sources de RIPS disponibles sur SourceForge .

Depuis le site RIPS:

RIPS est un outil écrit en PHP pour trouver des vulnérabilités dans les applications PHP en utilisant l'analyse de code statique. En tokenisant et en analysant tous les fichiers de code source, RIPS est capable de transformer le code source PHP en un modèle de programme et de détecter les puits sensibles (fonctions potentiellement vulnérables) qui peuvent être entachés par l'entrée d'utilisateur (influencée par un utilisateur malveillant) pendant le déroulement du programme. Outre la sortie structurée des vulnérabilités trouvées, RIPS propose également un cadre d'audit de code intégré pour une analyse manuelle plus poussée.

SteAp
la source
RIPS est un projet à moitié mort et il fonctionne uniquement avec du code php non-OOP.
alexglue
3

Il existe un outil absolument nouveau pour l'analyse de code statique appelé PHP Analyzer .

Parmi de nombreux types d'analyses statiques, il fournit également des fonctionnalités de fixation automatique de base, voir la documentation .

MISE À JOUR: PHP-Analyzer est désormais un projet obsolète mais vous pouvez toujours y accéder sur la branche héritée

fatganz
la source
2

Vous voudrez peut-être essayer de compiler avec le hiphop de Facebook.

Il effectue une analyse statique sur l'ensemble du projet et peut être ce que vous recherchez.

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

Martin Konecny
la source