¿Cómo realizar análisis de código estático en php? [cerrado]


466

¿Existe una herramienta de análisis estático para archivos fuente PHP? El binario en sí puede verificar si hay errores de sintaxis, pero estoy buscando algo que haga más, como:

  • asignaciones de variables no utilizadas
  • matrices que se asignan sin inicializarse primero
  • y posiblemente advertencias de estilo de código
  • ...

57
Righty-o: cerrado por SO, cuando claramente este tipo de respuesta es increíblemente útil.
Ira Baxter

3
de acuerdo. Esta pregunta es crucial. php lint (php -l file) no puede proporcionar la otra mitad: ejecute la carga automática, asegúrese de que exista una función llamada, que existan variables, que existan propiedades de objeto. etc.
Max

66
@IraBaxter es útil, pero no, estrictamente hablando, sobre el tema. softwarerecs.stackexchange.com es probablemente una ubicación más sobre el tema. Por supuesto, la ironía aquí es que muchos más desarrolladores están familiarizados con SO que con su hermano ...
Wayne Werner

77
El hecho de que tanta gente encuentre útil este tipo de pregunta es probablemente la razón por la cual ahora existen los registros de software. Ciertamente parecía en el tema cuando este era el único sitio de intercambio de pila. Ahora que hay un lugar claro para ello, ¿tiene sentido migrar?
eswald

44
Cerrado debido a cerradores de gatillo feliz. ¡Bah!
Roadowl

Respuestas:


356

Ejecute php en modo lint desde la línea de comandos para validar la sintaxis sin ejecución:

php -l FILENAME

Los analizadores estáticos de nivel superior incluyen:

Los analizadores de nivel inferior incluyen:

Los analizadores de tiempo de ejecución, que son más útiles para algunas cosas debido a la naturaleza dinámica de PHP, incluyen:

Las bibliotecas de documentación phpdoc y doxygen realizan un tipo de análisis de código. Doxygen, por ejemplo, se puede configurar para representar gráficos de herencia agradables con graphviz .

Otra opción es xhprof , que es similar a xdebug, pero más ligera, lo que la hace adecuada para servidores de producción. La herramienta incluye una interfaz basada en PHP.


20
¡+1 por tomarme 6 horas de mi vida probando todas estas golosinas!
Abe Petrillo

14
@dimitko: Eso es porque php -lsolo puede leer un archivo de entrada a la vez (es decir, no funcionará si lo hace php -l file1.php file2.php). En su lugar, debe usar la -n 1opción, que le indica xargsque use solo una línea de entrada por proceso de comando. En cambio, eso hará que se ejecute php -l file1.phpseguido php -l file2.php, por separado. Al mismo tiempo, puede utilizar -P <n>para ejecutar procesos "n" a la vez, para paralelizar la ejecución:find . -name '*.inc' -o -name '*.php' -print0 | xargs -0 -n1 -P10 php -l
Joe

11
find /your/path -name '*.php' -exec php -l {} \;Funciona de manera confiable.
Koen

11
NB : Para la función integrada de pelusa ( php -l) al trabajo, debe establecer display_errors = onen php.ini, de lo contrario sólo recibirá un mensaje genérico sobre la existencia de errores de sintaxis, pero no hay detalles acerca de qué error (s) o qué línea (s).
Synetech

8
Synetech - Buena. Sin embargo, puede anular la configuración en la línea de comando, utilizando el -dinterruptor. Por ejemplophp -l -d display_errors=on $FILENAME
troelskn



24

PHP Mess Detector es impresionante y rápido.


77
¡Gracias! Estaba buscando una increíble. De hecho, me niego a usar cualquier cosa que no sean herramientas increíbles. :)
contrato del Prof. Falken incumplió el

1
Es un comienzo, y parece ser lo que usa Netbeans, pero no confiaría completamente en él. Algunas de sus opciones son simplemente extrañas (¿le "avisa" si usa una instrucción else?), Y hay numerosos errores importantes en sus detecciones, que ni siquiera han recibido respuesta de los desarrolladores: github.com/phpmd / phpmd / issues
NoBugs

sino agrega complejidad ciclomática y a menudo se puede escribir de manera diferente para evitar y más. por ejemplo, if (verdadero) {$ x = 1; } más {$ x = 2; } puede reescribirse: $ x = 2; if (verdadero) {$ x = 1; }
RichardAtHome

17

He intentado usar $ php -l y otras herramientas. Sin embargo, el mejor en mi experiencia (YMMV, por supuesto) es el paquete de herramientas pfff . Escuché sobre pfff en Quora ( http://www.quora.com/Is-there-a-good-PHP-lint-static-analysis-tool )

Puedes compilarlo e instalarlo. No hay paquetes agradables (en mi Debian de menta, tuve que instalar libpcre3-dev, ocaml, libcairo-dev, libgtk-3-dev y libgimp2.0-dev primero) pero debería valer la pena un intsall.

Los resultados se informan 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.

Gracias. Sigue quejándose de nuestras importaciones dinámicas, pero sus otras capacidades se ven bien hasta ahora. También necesitaba instalar binutils-gold, y Scheck necesitaba instalarse en una ruta personalizada, pero parece funcionar ahora.
eswald

1
@eswald Hoy en día soy un convertidor de php mess detector (phpmd). De todas las herramientas que he probado hasta ahora (sniffer de código php, scheck, php -l, phpmd), en mi humilde opinión, phpmd funciona mejor para mi caso.
rjha94

¿Sabes dónde encontrar a Scheck?
George Katsanos

1
@GeorgeKatsanos scheck es parte del conjunto de herramientas pfff. github.com/facebook/pfff
rjha94

2
Scheck siempre me da el error "el verificador de php necesita un archivo gráfico". La documentación mayormente inexistente no tiene ejemplos.
Robert Bruce

14

Vea CloneDR de Semantic Designs , una herramienta de "detección de clones" que encuentra código de copiar / pegar / editado. Encontrará fragmentos de código exactos y casi erróneos, a pesar de los espacios en blanco, comentarios e incluso cambios de nombre variables. Un informe de detección de muestra para PHP se puede encontrar en el sitio web. (Soy el autor)


1
Mirando el sitio, parece una herramienta increíble. ¡Voy a echar un vistazo más de cerca más tarde! Gracias por el enlace (+1 por "Yo soy el autor" también)
Eric Cope

La ruina de cualquier pregrado intrigante.
wom

7

El IDE de NetBeans busca errores de sintaxis, variables inusitadas y demás. No está automatizado, pero funciona bien para proyectos pequeños o medianos.


6

Hay una nueva herramienta llamada nWire para PHP . Es un complemento de exploración de código para Eclipse PDT y Zend Studio 7.x. Permite el análisis de código en tiempo real para PHP y proporciona las siguientes herramientas:

  • Visualización de código: representación gráfica interactiva de componentes y asociaciones.
  • Navegación de código: la vista de navegación única muestra todas las asociaciones y trabaja con usted mientras escribe o lee el código.
  • Búsqueda rápida: busca a medida que escribes métodos, campos, archivos, etc.

1
No es la respuesta a la pregunta. como respuesta existen netbeans, etc.
Yosef

5

PHP PMD (detector de desorden de proyecto) y PHP CPD (detector de copiar y pegar) como la parte anterior de PHPUnit


4

Hay RIPS: un analizador de código fuente estático para vulnerabilidades en scripts PHP . Fuentes de RIPS disponibles en SourceForge .

Desde el sitio RIPS:

RIPS es una herramienta escrita en PHP para encontrar vulnerabilidades en aplicaciones PHP usando análisis de código estático. Al tokenizar y analizar todos los archivos de código fuente, RIPS puede transformar el código fuente de PHP en un modelo de programa y detectar sumideros sensibles (funciones potencialmente vulnerables) que pueden contaminarse por la entrada del usuario (influenciada por un usuario malintencionado) durante el flujo del programa. Además del resultado estructurado de las vulnerabilidades encontradas, RIPS también ofrece un marco de auditoría de código integrado para un análisis manual adicional.


RIPS es un proyecto medio muerto y funciona solo con código php no OOP.
alexglue

3

Existe una herramienta absolutamente nueva para el análisis de código estático llamada PHP Analyzer .

Entre muchos tipos de análisis estático, también proporciona una funcionalidad básica de reparación automática, consulte la documentación .

ACTUALIZACIÓN: PHP-Analyzer ahora es un proyecto obsoleto, pero aún puede acceder a él en la rama heredada


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.