¿Qué herramientas de análisis estático de código abierto C ++ están disponibles? [cerrado]


301

Java tiene algunas muy buenas herramientas de análisis estático de código abierto como FindBugs , Checkstyle y PMD . Esas herramientas son fáciles de usar, muy útiles, se ejecutan en múltiples sistemas operativos y son gratuitas .

Los productos comerciales de análisis estático C ++ están disponibles. Aunque tener estos productos es excelente, el costo es demasiado para los estudiantes y generalmente es bastante difícil obtener una versión de prueba.

La alternativa es encontrar herramientas de análisis estático de C ++ de código abierto que se ejecutarán en múltiples plataformas (Windows y Unix). Al usar una herramienta de código abierto, podría modificarse para adaptarse a ciertas necesidades. Encontrar las herramientas no ha sido tarea fácil.

A continuación se muestra una breve lista de herramientas de análisis estático de C ++ que fueron encontradas o sugeridas por otros.

¿Cuáles son algunas otras herramientas portátiles de análisis estático de código abierto C ++ que cualquiera conoce y puede recomendar?

Algunos enlaces relacionados.


Comercial, DMS Software Reengineering Toolki, maneja Java, C, C ++ y COBOL, proporciona análisis, creación de AST, resolución de nombre / tipo, análisis de control / flujo de datos, análisis personalizado y transformación. Consulte semanticdesigns.com/Products/DMS/DMSToolkit.html .
Ira Baxter

1
Para la herramienta comercial también hay CppDepend ( cppdepend.com ), y tal vez la versión de prueba podría ser suficiente para los estudiantes.

Respuestas:


21

Oink es una herramienta construida sobre el front-end de Elsa C ++. Mozilla's Pork es un tenedor de Elsa / Oink.

Ver: http://danielwilkerson.com/oink/index.html


1
He compilado más de 1000 programas en mi vida, pero por el amor de Dios no puedo compilar este paquete sin importar qué. Intenté usar Fedora, Ubuntu, WSL, Cygwin, MSYS2, Windows, pero no. Siempre falta algo y la documentación es simplemente horrible. No me malinterpreten, supongo que la herramienta es excelente. Pero el sitio web y la documentación parece que nadie los tocó en 10-15 años.
Apache

73

CppCheck es de código abierto y multiplataforma.

Mac OS X:

brew install cppcheck

1
@gio No he visto ningún problema personalmente. Creo que CppCheck tiene la capacidad de ignorar o excluir ciertas rutas o archivos, lo que ayuda a reducir el alcance.
Soo Wei Tan

1
En Windows:choco install cppcheck
KindDragon

53

Con respecto al compilador GNU, gcc ya tiene una opción integrada que permite advertencias adicionales a las de -Wall. La opción es -Weffc ++ y se trata de las violaciones de algunas pautas de Scott Meyers publicadas en sus libros " C ++ efectivo y más efectivo ".

En particular, la opción detecta los siguientes elementos:

  • Defina un constructor de copia y un operador de asignación para clases con memoria asignada dinámicamente.
  • Prefiere la inicialización a la asignación en constructores.
  • Convierta los destructores en virtuales en las clases base.
  • Haga que "operator =" devuelva una referencia a * this.
  • No intente devolver una referencia cuando deba devolver un objeto.
  • Distinga entre las formas de prefijo y postfijo de los operadores de incremento y decremento.
  • Nunca sobrecargue "&&", "||" o ",".

77
Además de -Wall y -Weffc ++ de gcc, -Wextra realiza un buen análisis estático gratuito, por ejemplo, ramas que no devuelven un valor, o comprueba que un signo sin signo sea menor que cero. Es notable la frecuencia con la que los programadores profesionales piensan que esta última es una buena idea ...
Flash Sheridan

24
Yuck, -Weffc++advierte sobre toneladas de construcciones que están perfectamente bien en una gran base de código. Sin -Wextraembargo, secundo la sugerencia de ; no salgas de casa sin ella!
Tom

29

En desarrollo por ahora, pero clang hace análisis de C y está dirigido a manejar C ++ con el tiempo. Es parte del proyecto LLVM .

Actualización : Si bien la página de inicio dice "El analizador es un trabajo continuo en progreso", sin embargo, ahora está documentado como un analizador estático para C y C ++.

Pregunta: ¿Cómo puedo ejecutar GCC / Clang para análisis estático? (solo advertencias)

Opción del compilador: -fsyntax-only


1
LLVM es un proyecto muy interesante que, en comparación con gcc, genera más binarios optimizados en menos tiempo; y el sonido metálico, cuando esté completo, será su front-end ...
Nicola Bonelli

Otro editor agregó la información sobre el modificador -fsyntax-only. Solo tenga en cuenta que es esencialmente una solicitud para ejecutar el análisis que el compilador ejecutaría sin compilar realmente, y emitir las advertencias. No estoy seguro, pero creo que es diferente del análisis estático.
Don Wakefield

17

Alguien más mencionó -Weffc ++, pero esa es en realidad una de las únicas advertencias de GCC que no enciendo por defecto. Sin embargo, el conjunto de advertencias que enciendo es la herramienta de análisis estático más importante en mi kit. Puede ver la lista completa de advertencias recomendadas .

En resumen:

-pedantic -Wall -Wextra -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat = 2 -Winit-self -Wlogical-op -Wmissing-declaraciones -Wmissing-include-dirs -Wnoexcept -Wold -style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-conversion -Wsign-promo -Wstrict-null-sentinel -Wstrict-overflow = 5 -Wswitch-default -Wundef -Werror -Wno-no utilizado

Tenga en cuenta que algunos de estos requieren una nueva versión de gcc, por lo que es posible que deba eliminarlos de su lista si está atrapado en 4.5 o algo así.



7

Si por código abierto realmente quisiste decir "gratis", entonces el análisis rápido de Microsoft es bueno. Por supuesto solo para Windows. Está totalmente integrado en Visual Studio y el compilador. p.ej:

cl /analyze Sample.cpp

¿En qué versión y edición está disponible?
twk

Parece estar integrado en el compilador, que es gratuito. La integración es probablemente solo edición Team.
JBRWilkinson


4

La férula parece llenar la factura de C.

Si no se ha especificado de código abierto que diría Gimpel Software 's PC-lint es probablemente una de las mejores herramientas disponibles para la comprobación de código estático en C ++. Pero, por supuesto, no es de código abierto.

Mac OS X:

brew install splint

2
Pero caro para un desarrollador único :) Me gusta más gratis
Robert Gould

66
la férula es para C, no para C ++. No sé si planean expandir la cobertura o no. ¡Eso espero!
Harold Bamford el

Sí, vale la pena probar pclint, su contraparte en Unix se llama flexe-lint, la versión 9.0 es más rápida que la versión 8.x, la versión 9.0 también admite encabezado precompilado para acelerar el análisis. Toma tiempo domar la PC-lint, tiene falsos positivos, lo que puede llevarlo a problemas si no puede ignorarlo selectivamente.
zhaorufei

3

PREFast de Microsoft también está disponible en el Kit de controladores de Windows. La versión 7.0 se puede descargar aquí .

Los documentos de Microsoft establecen que solo debe ejecutarse contra el código del controlador, pero esta (antigua) publicación de blog establece los pasos para ejecutarlo. ¿Quizás se pueda integrar en un proceso de compilación normal?


PREFast ralentizará mucho su proceso de compilación, para cualquier proyecto real, su servidor de compilación tal vez no pueda permitírselo.
zhaorufei

@zhaorufei: La mayoría de los análisis estáticos no son "rápidos"; tienen un trabajo de análisis de código bastante complejo que hacer, por definición. Si no le gusta el costo de construcción todo el tiempo, hágalo opcional.
Ira Baxter

2

Hemos estado trabajando en un complemento Eclipse CDT llamado metriculator. Todavía está en desarrollo, pero algunas métricas importantes (por ejemplo, LSLOC, McCabe, EfferentCoupling) ya están implementadas.

Consulte http://sinv-56013.edu.hsr.ch/redmine/projects/metricular/wiki/Documentation para obtener más detalles, como demostraciones en video y documentación.

La última versión nocturna está disponible para su instalación a través del sitio de actualización en: http://sinv-56013.edu.hsr.ch/metriculator/updatesite-nightly/site/

Descripción adicional

Metriculator analiza estáticamente el código fuente de C ++ y genera métricas de software. Las métricas se implementan como verificadores Codan. Los resultados del análisis se pueden explorar en una vista separada. Cada métrica tiene propiedades configurables (por ejemplo, un umbral para 'líneas máximas de código por función'). Exceder estos umbrales informará un problema y creará un marcador en el editor de código fuente.

con el metriculador puedes:

  • analizar archivos / carpetas / proyectos C ++
  • definir umbrales de métrica y habilitar / deshabilitar métrica usando la página de preferencias de Codans
  • tener marcadores de problemas en los editores de código fuente
  • explorar resultados métricos
  • exportar resultados métricos como nube de etiquetas (disponible como característica opcional a través del sitio de actualización)

Actualmente, el metriculador viene con las siguientes métricas:

  • McCabe (Complejidad ciclomática)
  • Acoplamiento eferente por tipo
  • Líneas de código fuente lógico
  • Número de miembros por tipo
  • Número de parámetros por función

1

Deberías probar oo-browser, tiene una integración increíble con xemacs


1

También se pueden codificar extensiones de GCC en MELT (un lenguaje específico de dominio diseñado para extender GCC) o complementos de GCC en C (mucho más difícil) para hacer un análisis personalizado.


2
He leído uno de los PDF sobre MELT y la extensión de gcc con melt, creo que todavía es demasiado complejo / difícil agregar sus propios complementos a gcc. No es una forma práctica para el usuario común.
zhaorufei

1
Extender GCC es complejo, de cualquier forma que lo haga (a través de complementos de C, a través de MELT o incluso a través de Python). Esto se debe a que GCC es complejo. Y personalizar cualquier herramienta de análisis estático de C ++ es difícil porque la especificación del lenguaje C ++ es muy compleja, y necesitará manejar la mayor parte de esa complejidad (cualquier programa C ++ no trivial usa muchas características de C ++, quizás a través de la biblioteca estándar de C ++) .
Basile Starynkevitch

0

Doxygen hace un análisis de flujo de control y genera gráficos. Puede que no sean lo que estás buscando, pero creo que son útiles para mirar.

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.