2010-11-13 38 views
6

A menudo podría usar algunas herramientas para analizar estáticamente mi código para ayudarme a hacerlo más limpio. Algo así como las advertencias del compilador, pero esas no son suficientes. De vez en cuando, sueño con escribir uno (usando clang libraries o gccxml), pero creo que tomaría demasiado trabajo.C++: herramientas para analizar estáticamente el código (y/o preprocesarlo)

Algunas cosas que aparecen a la mente son:

  1. en busca de números mágicos (es decir: los números constantes Hardcoded diferentes a 0).

  2. comprobando que siempre se respeta la regla de tres (cada clase debe haber definido ya sea todo destructor, constructor de copia y operador de asignación, o ninguno de ellos).


También sueño (pero estas cosas son pura utopía) sobre un preprocesador que analiza algún código no estándar y lo traduce a C válida código ++, una herramienta capaz de:

  1. expandir alias de plantilla, para que pueda tenerlos en C++ (bueno, con C++ 0x esto ya no es necesario)

  2. mover las funciones en línea al final de los archivos, para que no tenga que respetar el declarar-bef regla de uso de mineral, y puedo escribir clases en línea como en Java.

  3. ofrecen una sintaxis extendida, como soporte de operadores personalizados (que se expandirán en llamadas a funciones), o alguna sintaxis/palabra clave ad-hoc para implementar fácilmente algunos patrones.


¿Hay alguna herramienta por ahí, capaz de hacer un subconjunto de estas cosas?

De lo contrario, ¿qué bibliotecas sugerirías para implementar estas tareas (clang libs, gccxml, ...) y cuánto trabajo crees que tomaría?

+1

-WeffC++ hará 2. para usted. – James

+0

posible duplicado de [¿Qué herramientas de análisis estático C++ de código abierto están disponibles?] (Http: // stackoverflow.com/questions/141498/what-open-source-c-static-analysis-tools-are-available) –

Respuesta

1

clang puede hacer el análisis estático.

+0

Según la [documentación] (http://clang-analyzer.llvm.org/) , clang solo puede hacer análisis estáticos para C y Objective-C. ¿Alguna vez lo usaste para C++? –

+0

No lo he usado realmente. Me imagino que el análisis C++ está en proceso de ser escrito, el soporte del compilador para C++ es solo reciente. –

+0

de hecho http://clang-analyzer.llvm.org/dev_cxx.html –

0

En cuanto a la búsqueda de constantes, nuestra SD Source Code Search Engine (SCSE) puede hacerlo de la estantería. SCSE proporciona una interfaz GUI para buscar en grandes conjuntos de archivos de lenguaje de programación mixtos, utilizando un lenguaje de consulta que comprende la sintaxis léxica de cada idioma con precisión.

Una consulta típica:

'for' ... I=index* '=' N<10 

encontrarán para palabras clave cerca de un I dentifier cuyo nombre debe comenzar con la secuencia índice seguido inmediatamente por un operador = seguido de un N umber cuyo valor es inferior a 10. Debido a que SCSE entiende la estructura del lenguaje, no le molestan el espacio en blanco o las restricciones de formato. También coincidirá con los valores hexadecimales para N; entiende el formato diferente para literales y ofrece consultas en términos del valor real del número, en lugar de como una cadena.

Dada esta consulta, la GUI encontrará todas las coincidencias en todos sus archivos y mostrará un conjunto de visitas; un clic en un golpe le lleva el código fuente con la línea de golpe resaltada.

Para encontrar todas las constantes que no son cero, se escribe la siguiente consulta muy simple:

N>0 

Lo que realmente quiere son todas las constantes que no están definidos en una especie de constante definición. Por lo que desea quitar cualquier-definiciones constantes de la lista de resultados, que se lleva a cabo mediante el uso de la "consulta de resta" operador:

N>0 - 'const' 'int' I '=' N 

Esto encuentra constantes distintas de cero, y se eliminarán los que también se corresponde con la declaración const .


Sus otros sueños requieren un motor mucho más sofisticado. En esencia, desea analizar el código C++ (su regla de tres) o extender el lenguaje C++ con algunas características nuevas, y luego implementar esas características utilizando las capacidades estándar de C++. Puede lograr esto usando program transformation system que puede manipular C++.

Nuestra DMS Software Reengineering Tookit puede hacerlo. Tiene un completo C++ front end que analiza C++ a las estructuras de datos del compilador interno y crea tablas de símbolos completas (y puede regenerar el código fuente de C++ con todos los detalles de sus estructuras internas). Usando esa interfaz y las capacidades de coincidencia de patrones integradas de DMS, podría implementar su verificación de regla de tres.

Para las extensiones de idioma, puede modificar la interfaz de DMS C++ modificando su gramática para incluir las construcciones adicionales que considere ideales. Luego, puede escribir transformaciones de programa que busquen dichos constructos y transformarlos en el código deseado. (Esta idea fue llamada intentional programming por Charles Simyoni de MS fama, pero es solo un caso especial de transformación de programa.)

DMS se ha utilizado para llevar a cabo transformaciones automáticas masivas en aplicaciones C++ reales. Podría hacer su tarea con bastante facilidad desde un punto de vista técnico. Sin embargo, comprender la definición de C++ y cómo encaja todo, y cómo DMS admite las transformaciones, requiere una sofisticación considerable al estilo del compilador. Lo que sugieres que hagas no es una tarde o una semana de trabajo. Tomaría una inversión significativa en educación y esfuerzo. Pero mucho menos que intentar hacer con solo comenzar con YACC.

Cuestiones relacionadas