2009-02-13 23 views
7

Actualmente estoy en el proceso de aprender C++, y porque todavía estoy aprendiendo, sigo cometiendo errores.
Con un lenguaje tan permisivo como C++, a menudo toma mucho tiempo descubrir qué es lo que está mal, porque el compilador me permite salir con la suya. Me doy cuenta de que esta flexibilidad es una de las principales fortalezas de C++, pero hace que sea difícil aprender el lenguaje básico.
¿Existe alguna herramienta que pueda usar para analizar mi código y hacer sugerencias basadas en las mejores prácticas o simplemente en la codificación sensata? Preferiblemente como un plugin de Eclipse o una aplicación de Linux.Herramientas de análisis de código C++

Respuesta

17

Habilite las advertencias máximas del compilador (esta es la opción -Wall si está utilizando el compilador Gnu).

'Lint' es la herramienta de análisis estática arquetípica.

valgrind es un buen analizador de tiempo de ejecución.

+2

+1 para valgrind. Encuentra muchos errores sutiles novatos como desactivar uno. – ypnos

+0

+1 para pelusa, una herramienta tan sorprendente – JaredPar

+1

Tenga en cuenta que la mayoría de las versiones de pelusa están escritas para C y son bastante inútiles para C++. Gimple PC-Lint es una excepción. –

2

pelusa - hay muchas versiones, pero si busca la pelusa en Google, debería encontrar una que funcione. La otra cosa que hacer es encender las advertencias del compilador: si está utilizando gcc/g ++, la opción es -Wall.

Puede encontrar CppChecker útil como un complemento para Eclipse que admita gcc/PC lint.

3

El soporte de herramientas para C++ es bastante malo en comparación con Java, C#, etc. porque no tiene una gramática libre de contexto. De hecho, hay partes de la gramática C++ que son indecidibles. Básicamente, eso significa que la comprensión del código C++ en el nivel sintáctico requiere la implementación de una interfaz de compilación con análisis semántico. C++ no se puede analizar en una AST independientemente del análisis semántico, y la mayoría de las herramientas de análisis de código en IDE, etc. funcionan en el nivel AST. Esto es parte de la compensación que usted hace a cambio de la flexibilidad y la compatibilidad con versiones anteriores de C++.

+0

Y esta es exactamente la razón por la que quería gritar cuando vi las nuevas características que el comité de estándares iba a agregar en C++ 0x. –

+0

C++ tiene una gramática libre de contexto muy precisa, y se puede analizar sin análisis semántico si todo lo que quiere es un árbol de sintaxis (y algunas ambigüedades). Debe dejar de usar tecnología de análisis débil como LALR (por ejemplo, YACC). Consulte los analizadores GLR, y especialmente vea Elsa www.eecs.berkeley.edu/~smcpeak/elkhound/sources/elsa/ y el kit de herramientas de reingeniería de software DMS www.semanticdesigns.com/Products/FrontEnds/CppFrontEnd.html Ambos las herramientas también proporcionan un "análisis semántico" completo en el sentido de determinar el significado de los símbolos y eliminar las ambigüedades del árbol de análisis sintáctico, si se les solicita. –

+0

Sí, pero la parte de algunas ambigüedades fue el punto que estaba tratando de hacer. – dsimcha

5

Para g ++, además de encender -Wall, enciéndalo también -pedante, ¡y prepárese para sorprenderse por el número de problemas que encuentra!

2

Creo que realmente lo que necesita aprender aquí es cómo depurar fuera de un IDE. En mi opinión, esta es una habilidad valiosa, ya que no necesitará un conjunto de herramientas tan pesado para desarrollar software, y se aplicará a la gran mayoría de los idiomas que ya conoce y aprenderá alguna vez.

Sin embargo, es difícil acostumbrarse. Deberá escribir el código solo para fines de depuración, p. escriba cheques después de cada línea que aún no se haya depurado, para asegurarse de que el resultado sea el esperado, o imprima los valores en la consola o en cuadros de mensaje para que pueda verificarlos usted mismo. Es tedioso pero te permitirá detectar tus errores más fácilmente, dentro o fuera de un IDE.

Descargue y pruebe algunas de las herramientas de depuración gratuitas como GDB, también, pueden ayudarlo a sondear la memoria, etc., sin tener que escribir su propio código.

6

Creo que será mejor que tenga algunas conferencias sobre buenas prácticas y por qué son buenas. Eso debería ayudarlo más que una herramienta de análisis de código (al principio, al menos).

le sugiero que lea la serie de Effective C++ y ** Effective STL libros, por lo menos.Ver alsot The Definitive C++ Book Guide and List

+0

En segundo lugar el comentario está leyendo estos libros (+1). –

+1

+1 para los libros efectivos C++ de Meyer. –

3

Encender todas las advertencias del compilador (al menos inicialmente) y luego entender lo que significan, cómo solucionar los problemas resaltados y cuáles de las advertencias representan construcciones genuinas que los compiladores pueden considerar ambiguas es un buen primer paso.

Si necesita algo más pesado, puede intentar PC-Lint si está en Windows, que sigue siendo una de las mejores herramientas de pelusa para C++. Solo tenga en cuenta que deberá configurar estas herramientas para reflejar su estilo de codificación; de lo contrario, se inundarán de advertencias y no podrán ver la madera de los árboles. Sí, cuesta dinero y es probable que sea un poco exagerado si no está haciendo C++ en un nivel de "pago por ello", pero me parece invaluable.

3

Hay una lista de herramientas de análisis de código estático en wikipedia.

Pero las advertencias son buenas en general, pero un problema para habilitar todas las advertencias con pedantic y Wall es la cantidad de advertencias que puede obtener al incluir encabezados que no tiene control, esto puede generar mucho ruido. Sin embargo, prefiero compilar mi propio software con todas las advertencias habilitadas. Como programo en Linux que suele hacer así:

Ponga las cabeceras externas que necesito incluir en un archivo separado, y en el inicio de ese archivo antes de que la incluye poner:

#pragma GCC system_header 

Y a continuación, incluir este archivo de tu código Esto le permite ver todas las advertencias de su propio código sin que se ahogue en las advertencias del código externo. La desventaja es que es una solución específica de gcc, no conozco ninguna solución independiente de plataforma para esto.

Cuestiones relacionadas