¿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.

jnancheta
fuente
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

Daniel S Wilkerson
fuente
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
Soo Wei Tan
fuente
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 ",".
Nicola Bonelli
fuente
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

Don Wakefield
fuente
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í.

David Stone
fuente
14

John Carmack también menciona PVS-Studio en esta interesante publicación de blog sobre "Análisis de código estático" .

Alex Zakharenko
fuente
44
No es "código abierto" y absoluta y positivamente no es "libre" en ningún tipo de significado de esa palabra. Es una herramienta de análisis estático bien conocida (creo que solo es la cobertura), pero su precio es bastante alto.
Tomás Pruzina
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
usuario15071
fuente
¿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
Onorio Catenacci
fuente
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?

tmitchell
fuente
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
jules
fuente
1

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

Judas
fuente
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.

Basile Starynkevitch
fuente
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.

Paul Nathan
fuente