2009-03-10 12 views
144

Me interesa una herramienta gratuita que pueda verificar estáticamente mi código C++ como lo hace Lint. ¿Algún consejo?C/C++ ¿Alternativa libre a Lint?

+3

Esta pregunta SO tiene respuestas relevantes: [¿Cuál es la mejor herramienta de línea de comando para limpiar el código?] (Http://stackoverflow.com/questions/393208/what-is-the-best-command-line- tool-to-clean-up-code) –

+0

https://github.com/facebookarchive/flint – Jimbo

Respuesta

143

Trate cppcheck, encuentran aquí: http://cppcheck.sourceforge.net/

He aquí una muestra de algunos de los controles que puede realizar o que yo he utilizado para:

  • índices de matriz fuera de límites
  • de memoria/resource leaks
  • Improved new/delete
  • Falla en poner destructores virtuales en las clases derivadas
  • asignación no coincidente y cancelación de asignación
  • desasignación de un puntero desasignado
  • Usando variable después de que se cancela la asignación/liberado
  • Tamaño no coincide con
  • radix no válida en llamada a strtol o strtoul
  • La superposición de los buffers de datos
  • sin signo división; resultado puede ser mal
  • puntero Unusual aritmética
  • Volviendo puntero a variable de matriz local de
  • Same iterador se utiliza con dos contenedores
  • de uso peligroso de borrado
  • Después de retroceso o pushfront, iterador puede ser no válida
  • Buffer desborda
  • uso peligroso de strncat, posible tampón invadido
+21

+1 para CppCheck. ¡Gran herramienta! Solo tenga en cuenta que * siempre * devuelve un código distinto de cero si detecta * cualquier * problema (incluso el estilo si están configurados). Si está utilizando un sistema de compilación automatizado, esto puede marcar las compilaciones como fallidas. – MattyT

+0

¿Reemplaza la pelusa o es una adición? – To1ne

+9

@ To1ne: _lint_ es para el código C, _cppcheck_ es para el código C++. –

5
+0

splint se confunde con la sintaxis "más reciente", donde "más nuevo" son las convenciones de C++ que se han retrotraído a C en el último 10 años. –

+0

Upps, ¿así que la férula es c solamente? – Johan

+2

Sí, la férula es solo C, y por mi experiencia no hace mucho de lo que hace un GCC/Clang reciente. Aunque YMMV. – ideasman42

34

Tal vez una lista como esta es lo que está buscando:

http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis

Parece que obtendrá la mayoría del uso de Splint o Uno.

+9

splint no es compatible con C++ –

+0

ah, ese es un buen punto. Desearía haberlo notado antes. –

+1

splint es realmente inútil a menos que tenga una delineación clara entre el código C y C++, ya que la convención de usar .h para el sufijo de ambos encabezados C y C++ significa que la férula arrojará alegremente toneladas de advertencias sobre ese archivo .h completo de plantillas, clases, etc. que le indicó que escaneara con '* .h'. –

2

Recientemente leí sobre DeHydra y Pork utilizado por Mozilla, aunque yo no lo he probado yo.

+2

desde la página principal de DeHydra - "El desarrollo de Dehydra fue abandonado en algún momento en 2010. Uso bajo su propio riesgo". – mdma

6

Personalmente probé cppcheck (v1.4) y me pareció imposible.

por ejemplo. Este ejemplo se detectó correctamente para matriz fuera de límites:

int a[4]; 
for (int n = 0; n < 5; n++) 
{ 
    a[n] = n; 
} 

Pero no se detectó este ejemplo:

int a[4]; 
int z = 4 + 1; 

for (int n = 0; n < z; n++) 
{ 
    a[n] = n; 
} 
+5

(error) Acceso al búfer fuera de límites: a – Beginner

+0

Esta respuesta ya no es verdadera (1.82), dos advertencias ahora: "[test.cpp: 6]: (error) Array 'a [4]' a la que se accede en el índice 4, que está fuera de límites. [test.cpp: 6]: (estilo) A la variable 'a' se le asigna un valor que nunca se usa. ". – Zitrax

21

Otra herramienta para la lista: Google cpplint.py, que ++ estilo de Google C guía mentions. Es muy específico de Google, pero no obstante.

+8

Cabe señalar que cpplint.py de Google comprueba principalmente las violaciones de _su_ estilo de codificación que pueden coincidir o no con el estilo que está siguiendo. –

+0

@Matt Briançon, las quejas de estilo de cpplint me molestan, especialmente porque combinan preocupaciones no relacionadas (donde se coloca el corchete es una cuestión de gusto, * no * un problema de calidad), pero me parece valioso usarlo solo para los cheques de encabezado (no utilizado/innecesario, faltante, etc.). Sigo pensando que debería bifurcarlo no solo para separar las preocupaciones, sino para hacerlo más configurable (opciones de CLI para deshabilitar/modificar verificaciones de estilo, etc.). –

+1

Mi cheque favorito de cpplint.py de Google está en la categoría 'runtime/explicit', específicamente el cheque para constructores de argumento único que no están marcados' explicit'.Esto detecta errores reales en código real y no da muchos "falsos positivos". –