Come eseguire analisi di codice statico in php? [chiuso]


466

Esiste uno strumento di analisi statica per i file sorgente PHP? Il binario stesso può verificare la presenza di errori di sintassi, ma sto cercando qualcosa che faccia di più, come:

  • assegnazioni di variabili non utilizzate
  • matrici assegnate senza prima essere inizializzate
  • e possibilmente avvisi in stile codice
  • ...

57
Righty-o: chiuso da SO, quando chiaramente questo tipo di risposta è incredibilmente utile.
Ira Baxter,

3
essere d'accordo. Questa domanda è cruciale. php lint (file php -l) non riesce a fornire l'altra metà: esegui il caricamento automatico, assicurati che esista una funzione chiamata, che esistano variabili, che esistano proprietà dell'oggetto. ecc.
Max

6
@IraBaxter utile, ma non, a rigore, sull'argomento. softwarerecs.stackexchange.com è probabilmente una posizione più tematica. Naturalmente l'ironia qui è che molti più sviluppatori hanno familiarità con SO di quanto non sia fratello ...
Wayne Werner,

7
Il fatto che così tante persone trovino utile questo tipo di domanda è probabilmente il motivo per cui ora esiste il software. Sembrava sicuramente in discussione quando questo era l'unico sito di scambio di stack. Ora che c'è un posto chiaro per questo, ha senso migrare?
eswald,

4
Chiuso per chiusura a grilletto. Bah!
Roadowl,

Risposte:


356

Esegui php in modalità lint dalla riga di comando per convalidare la sintassi senza eseguire:

php -l FILENAME

Analizzatori statici di livello superiore includono:

Gli analizzatori di livello inferiore includono:

Gli analizzatori di runtime, che sono più utili per alcune cose a causa della natura dinamica dei PHP, includono:

Le librerie di documentazione phpdoc e doxygen eseguono una sorta di analisi del codice. Doxygen, ad esempio, può essere configurato per il rendering di bei grafici di ereditarietà con graphviz .

Un'altra opzione è xhprof , che è simile a xdebug, ma più leggera, che lo rende adatto ai server di produzione. Lo strumento include un'interfaccia basata su PHP.


20
+1 per aver impiegato 6 ore della mia vita nel provare tutte queste prelibatezze!
Abe Petrillo,

14
@dimitko: Questo perché php -lpuò leggere solo un file di input alla volta (ovvero, non funzionerà se lo fai php -l file1.php file2.php). È invece necessario utilizzare l' -n 1opzione, che indica xargsdi utilizzare solo una riga di input per processo di comando. Questo invece lo farà funzionare php -l file1.phpseguito da php -l file2.php, separatamente. Allo stesso tempo, è possibile utilizzare -P <n>per eseguire i processi "n" alla volta, al fine di parallelizzare l'esecuzione:find . -name '*.inc' -o -name '*.php' -print0 | xargs -0 -n1 -P10 php -l
Joe

11
find /your/path -name '*.php' -exec php -l {} \;funziona in modo affidabile.
Koen.

11
NB : Per la funzione built-in pelucchi ( php -l) al lavoro, è necessario impostare display_errors = onin php.ini, altrimenti si otterrà solo un messaggio generico circa là essendo errori di sintassi, ma nessun dettaglio su ciò che di errore (s) o quello di linea (s).
Synetech,

8
Synetech - Buono. Tuttavia, è possibile ignorare l'impostazione dalla riga di comando, utilizzando l' -dopzione. Ad esempiophp -l -d display_errors=on $FILENAME
troelskn,



24

PHP Mess Detector è fantastico e veloce.


7
Grazie! Stavo cercando un fantastico. In effetti, mi rifiuto di usare qualsiasi cosa tranne strumenti fantastici. :)
contratto del Prof. Falken ha violato il

1
È un inizio, e sembra essere quello che utilizza Netbeans, ma non mi fiderei completamente. Alcune delle sue opzioni sono semplicemente strane ("ti avvertono" se usi un'istruzione else ??), e ci sono numerosi grossi bug nei suoi rilevamenti, che non hanno nemmeno avuto una risposta dagli sviluppatori: github.com/phpmd / phpmd / issues
NoBugs

else aggiunge complessità ciclomatica e spesso può essere scritto diversamente per evitare e altro. ad es. se (vero) {$ x = 1; } else {$ x = 2; } può essere riscritto: $ x = 2; if (true) {$ x = 1; }
RichardAtHome il

17

Ho provato a usare $ php -l e accoppiare altri strumenti. Comunque il migliore della mia esperienza (YMMV, ovviamente) è scheck di pfff toolset . Ho sentito parlare di pfff su Quora ( http://www.quora.com/Is-there-a-good-PHP-lint-static-analysis-tool )

Puoi compilarlo e installarlo. Non ci sono pacchetti carini (sul mio Debian di zecca, dovevo installare prima le dipendenze libpcre3-dev, ocaml, libcairo-dev, libgtk-3-dev e libgimp2.0-dev) ma dovrebbe valere la pena di iniziare.

I risultati sono riportati come

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.

Grazie. Continua a lamentarsi delle nostre importazioni dinamiche, ma finora le sue altre capacità sembrano buone. Avevo anche bisogno di installare binutils-gold e scheck doveva essere installato in un percorso personalizzato, ma sembra funzionare ora.
eswald,

1
@eswald Ora un giorno sono un convertitore di php mess detector (phpmd). Di tutti gli strumenti che ho provato finora (sniffer codice php, scheck, php -l, phpmd), IMHO, phpmd funziona meglio per il mio caso.
rjha94,

Sai dove trovare Scheck?
George Katsanos,

1
@GeorgeKatsanos scheck fa parte del set di strumenti pfff. github.com/facebook/pfff
rjha94

2
Scheck mi dà sempre l'errore "php checker ha bisogno di un file grafico". La documentazione per lo più inesistente non ha esempi.
Robert Bruce,

14

Vedi CloneDR di Semantic Designs , uno strumento di "rilevamento clone" che trova codice copia / incolla / modificato. Troverà frammenti di codice esatti e quasi mancanti, nonostante spazi bianchi, commenti e persino rinominazioni variabili. Un report di rilevamento di esempio per PHP è disponibile sul sito Web. (Sono l'autore).


1
Guardando il sito, sembra uno strumento incredibile. Daremo un'occhiata più da vicino più tardi! Grazie per il link (+1 anche per "Sono l'autore")
Eric Cope,

La rovina di ogni studente universitario connivente.
wom

7

L'IDE NetBeans verifica la presenza di errori di sintassi, variabili non utilizzate e simili. Non è automatizzato, ma funziona bene per progetti di piccole o medie dimensioni.


6

C'è un nuovo strumento chiamato nWire per PHP . È un plug-in di esplorazione del codice per Eclipse PDT e Zend Studio 7.x. Abilita l'analisi del codice in tempo reale per PHP e fornisce i seguenti strumenti:

  • Visualizzazione del codice - rappresentazione grafica interattiva di componenti e associazioni.
  • Navigazione codice: la visualizzazione di navigazione unica mostra tutte le associazioni e lavora con te mentre scrivi o leggi il codice.
  • Ricerca rapida: cerca durante la digitazione di metodi, campi, file, ecc.

1
non è una risposta alla domanda. come risposta esiste netbeans ecc.
Yosef

5

PHP PMD (rilevatore di disordine di progetto) e PHP CPD (rilevatore di copia incolla) come parte precedente di PHPUnit


4

C'è RIPS - Un analizzatore di codice sorgente statico per vulnerabilità negli script PHP . Fonti di RIPS disponibili su SourceForge .

Dal sito RIPS:

RIPS è uno strumento scritto in PHP per trovare le vulnerabilità nelle applicazioni PHP utilizzando l'analisi del codice statico. Tokenizzando e analizzando tutti i file di codice sorgente RIPS è in grado di trasformare il codice sorgente PHP in un modello di programma e di rilevare i sink sensibili (funzioni potenzialmente vulnerabili) che possono essere contaminati dall'input dell'utente (influenzato da un utente malintenzionato) durante il flusso del programma. Oltre all'output strutturato delle vulnerabilità rilevate, RIPS offre anche un framework di audit del codice integrato per ulteriori analisi manuali.


RIPS è un progetto mezzo morto e funziona solo con codice php non OOP.
alexglue,

3

Esiste uno strumento assolutamente nuovo per l'analisi del codice statico chiamato PHP Analyzer .

Tra i molti tipi di analisi statica fornisce anche funzionalità di auto-fissaggio di base, consultare la documentazione .

AGGIORNAMENTO: PHP-Analyzer è ora un progetto obsoleto ma è ancora possibile accedervi sul ramo legacy


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.