Como executar a análise de código estático em php? [fechadas]


466

Existe uma ferramenta de análise estática para arquivos de origem PHP? O próprio binário pode verificar se há erros de sintaxe, mas estou procurando algo que faça mais, como:

  • atribuições de variáveis ​​não utilizadas
  • matrizes que são atribuídas sem serem inicializadas primeiro
  • e possivelmente avisos de estilo de código
  • ...

57
Righty-o: fechado pelo SO, quando claramente esse tipo de resposta é incrivelmente útil.
Ira Baxter

3
aceita. Esta questão é crucial. O php lint (arquivo php -l) falha ao fornecer a outra metade: execute o carregamento automático, verifique se existe uma função chamada, se existem variáveis, se existem propriedades do objeto. etc
Max

6
@IraBaxter útil, mas não, estritamente falando, sobre o tema. softwarerecs.stackexchange.com é provavelmente um local mais tópico. Claro que a ironia aqui é que muitos mais desenvolvedores estão familiarizados com SO do que do irmão ...
Wayne Werner

7
O fato de tantas pessoas acharem esse tipo de pergunta útil é provavelmente o motivo pelo qual softwarerecs agora existe. Certamente parecia voltar ao tópico quando este era o único site de troca de pilhas. Agora que há um lugar claro para isso, faz sentido migrar?
eswald

4
Fechado devido a fechos com gatilho. Bah!
Roadowl

Respostas:


356

Execute o php no modo lint na linha de comando para validar a sintaxe sem execução:

php -l FILENAME

Os analisadores estáticos de nível superior incluem:

Os analisadores de nível inferior incluem:

Os analisadores de tempo de execução, que são mais úteis para algumas coisas devido à natureza dinâmica do PHP, incluem:

As bibliotecas de documentação phpdoc e doxygen realizam um tipo de análise de código. O oxigênio, por exemplo, pode ser configurado para renderizar bons gráficos de herança com o graphviz .

Outra opção é o xhprof , que é semelhante ao xdebug, mas mais leve, tornando-o adequado para servidores de produção. A ferramenta inclui uma interface baseada em PHP.


20
+1 por tirar 6 horas da minha vida tentando todas essas guloseimas!
Abe Petrillo

14
@ Dimitko: Isso porque php -lsó é possível ler um arquivo de entrada por vez (isto é, não funcionará se você o fizer php -l file1.php file2.php). Em vez disso, você precisa usar a -n 1opção, que informa xargspara usar apenas uma linha de entrada por processo de comando. Isso fará com que seja executado php -l file1.phpseguido por php -l file2.php, separadamente. Ao mesmo tempo, você pode usar -P <n>para executar processos "n" por vez, a fim de paralelizar a execução:find . -name '*.inc' -o -name '*.php' -print0 | xargs -0 -n1 -P10 php -l
Joe

11
find /your/path -name '*.php' -exec php -l {} \;funciona confiável.
Koen.

11
NB : Para que a função lint interna ( php -l) funcione, é necessário configurá display_errors = on-la php.ini, caso contrário você receberá apenas uma mensagem genérica sobre a existência de erros de sintaxe, mas não há detalhes sobre quais erros ou linhas.
Synetech 14/07

8
Synetech - Bom. Você pode substituir a configuração na linha de comando, usando o -dswitch. Por exemplophp -l -d display_errors=on $FILENAME
troelskn 14/07



24

O PHP Mess Detector é incrível e rápido.


7
Obrigado! Eu estava procurando por um incrível. Na verdade, eu me recuso a usar qualquer coisa, menos ferramentas incríveis. :)
Contrato do Prof. Falken violado

1
É um começo, e parece ser o que o Netbeans usa, mas eu não confiaria completamente nele. Algumas de suas opções são simplesmente estranhas ("avisando" se você usar uma instrução else ??), e existem inúmeros erros grandes em suas detecções, que nem tiveram uma resposta dos desenvolvedores: github.com/phpmd / phpmd / issues
NoBugs 16/15

O else adiciona complexidade ciclomática e pode ser escrito de forma diferente para evitar outro. por exemplo, se (verdadeiro) {$ x = 1; } mais {$ x = 2; } pode ser reescrita: $ x = 2; se (verdadeiro) {$ x = 1; }
RichardAtHome

17

Eu tentei usar $ php -l e algumas outras ferramentas. No entanto, o melhor em minha experiência (YMMV, é claro) é um pedaço do conjunto de ferramentas pfff . Eu ouvi sobre o pfff no Quora ( http://www.quora.com/Is-there-a-good-PHP-lint-static-analysis-tool )

Você pode compilar e instalar. Não existem pacotes agradáveis ​​(no meu Debian mint, eu tinha que instalar as dependências libpcre3-dev, ocaml, libcairo-dev, libgtk-3-dev e libgimp2.0-dev primeiro), mas deve valer a pena um intsall.

Os resultados são relatados como

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.

Obrigado. Ele continua reclamando sobre nossas importações dinâmicas, mas seus outros recursos parecem bons até agora. Eu também precisava instalar o binutils-gold, e o scheck precisava ser instalado em um caminho personalizado, mas parece funcionar agora.
eswald

1
@ Eswald Hoje em dia eu sou um conversor de php mess detector (phpmd). De todas as ferramentas que tentei até agora (sniffer de código php, scheck, php -l, phpmd), IMHO, o phpmd funciona melhor para o meu caso.
Rjha94

Você sabe onde encontrar Scheck?
George Katsanos

1
@GeorgeKatsanos scheck faz parte do conjunto de ferramentas pfff. github.com/facebook/pfff
rjha94

2
Scheck sempre me dá o erro "o verificador php precisa de um arquivo gráfico". A documentação quase inexistente não tem exemplos.
Robert Bruce

14

Veja o CloneDR da Semantic Designs , uma ferramenta de "detecção de clones" que localiza o código de copiar / colar / editar. Ele encontrará fragmentos de código exatos e quase errados, apesar de espaços em branco, comentários e até renomeamentos de variáveis. Um relatório de detecção de amostra para PHP pode ser encontrado no site. (Eu sou o autor).


1
Olhando para o site, isso parece uma ferramenta incrível. Vou olhar mais de perto mais tarde! Obrigado pelo link (+1 por "Eu sou o autor")
Eric Cope

A proibição de qualquer graduação conivente.
Wom

7

O NetBeans IDE verifica erros de sintaxe, variáveis ​​não utilizadas e outras coisas. Não é automatizado, mas funciona bem para projetos pequenos ou médios.


6

Existe uma nova ferramenta chamada nWire for PHP . É um plug-in de exploração de código para Eclipse PDT e Zend Studio 7.x. Ele permite a análise de código em tempo real para PHP e fornece as seguintes ferramentas:

  • Visualização de código - representação gráfica interativa de componentes e associações.
  • Navegação de código - a visualização de navegação exclusiva mostra todas as associações e funciona com você enquanto você escreve ou lê o código.
  • Pesquisa rápida - pesquise enquanto você digita métodos, campos, arquivos etc.

1
não é resposta para pergunta. como resposta existe netbeans etc.
Yosef

5

PHP PMD (detector de bagunça de projeto) e PHP CPD (detector de copiar e colar) como a parte anterior do PHPUnit


4

Existe o RIPS - um analisador de código fonte estático para vulnerabilidades em scripts PHP . Fontes de RIPS disponíveis no SourceForge .

No site do RIPS:

O RIPS é uma ferramenta escrita em PHP para encontrar vulnerabilidades em aplicativos PHP usando análise de código estática. Ao tokenizar e analisar todos os arquivos de código-fonte, o RIPS pode transformar o código-fonte PHP em um modelo de programa e detectar sumidouros sensíveis (funções potencialmente vulneráveis) que podem ser contaminadas pela entrada do usuário (influenciada por um usuário mal-intencionado) durante o fluxo do programa. Além da saída estruturada das vulnerabilidades encontradas, o RIPS também oferece uma estrutura de auditoria de código integrada para análises manuais adicionais.


O RIPS é um projeto semi-morto e funciona apenas com código php não OOP.
Alexglue

3

Existe uma ferramenta absolutamente nova para análise de código estático chamada PHP Analyzer .

Entre muitos tipos de análise estática, ele também fornece a funcionalidade básica de correção automática, consulte a documentação .

ATUALIZAÇÃO: O PHP-Analyzer agora é um projeto obsoleto, mas você ainda pode acessá-lo na ramificação herdada


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.