2011-07-26 14 views
25

un montón de espagueti humeante acaba de aterrizar en mi escritorio, y mi tarea es entenderlo (para poder refaccionarlo/reimplementarlo).software de visualización de código de espagueti?

El código es C, y un lío de variables globales, tipos de estructuras y llamadas a funciones.

me gustaría trazar gráficos del código con la información:
- gráfico de llamadas
- ¿Qué tipos struct se utilizan en el cual funciona
- ¿Qué variable global se utiliza en qué función

Esperemos que este haría más fácil identificar los componentes conectados y extraerlos a módulos separados.

He intentado el siguiente software para propósitos similares:
- NCC
- CTags
- codeviz/GENGRAPH
- doxygen
- Egipto
- cflow
Edit2:
- frama-c
- snavigator
- Comprender

Las deficiencias de estos son
a) requiere que pueda compilar el código. Mi código no se compila, ya que partes del código fuente faltan.
b) problemas con las macros del preprocesador (como cflow, que quiere ejecutar ambas ramas de sentencias #if). Pasarlo por cpp estropearía los números de línea.
c) Por algún motivo, no logro que el software haga lo que quiero hacer (como doxygen; la documentación para la generación de gráficos de llamadas no es fácil de encontrar, y dado que no parece representar variables/tipos de datos) de todos modos, probablemente no valga la pena perder más tiempo aprendiendo sobre las opciones de configuración de doxygen). EDITAR: Seguí a these Doxygen instrcutions, pero solo trazó las dependencias de archivos de encabezado.

Estoy en Linux, por lo que es enorme plus si el software es para Linux y software libre. No estoy seguro de que mi jefe comprenda la necesidad de comprar un visualizador :-(

Por ejemplo, una herramienta de línea de comandos que enumera a qué funciones se hace referencia en un símbolo (= función, variable, tipo) sería de gran ayuda (como addr2line, pero para tipos/nombres de variables/funciones y el código fuente)

// T

+1

* "Ejecutarlo a través de cpp estropearía los números de las líneas." * - puede que le interese [Coan] (http://coan2.sourceforge.net/index.php?page=about) (vea [esto respuesta] (http://stackoverflow.com/questions/2786000/separate-specific-ifdef-branches/2786157#2786157)) – detly

+1

coan puede ser útil simplificando el desastre del preprocesador. ¡Gracias! –

Respuesta

3

Si te gusta la línea de comandos;). tal vez usted podría intentar cscope, se hace el análisis estático de código y se puede decir donde se hace referencia a algunos símbolos/variables/funciones ... No es el Santo Graal, pero puede ser muy útil navegar por el código fuente desconocido.

También hay algunas GUI que pueden manejar resultados de csope (Vi, Emacs, JEdit ...).

Por otro lado, Eclipse with the CDT plugin también puede ayudarlo a navegar en el código de spaghetti que debe mantener.

+0

+1 para eclipse, aunque si el código no se compila, es posible que deba agregar algunos archivos de encabezado para indexarlos a mano. –

0

Si desea saber en qué funciones se declara o se hace referencia a un símbolo, puede probar LXR. No está basado en la consola, pero es bastante útil.

6

Mi votación va a gnu global. Tiene todas las características combinadas de ctags/cscope, así como la posibilidad de generar html totalmente indexado que le permite navegar por el código en su navegador favorito. Actívelo en apache y tendrá un servicio web al que cualquier persona puede acceder, incluidas las capacidades de búsqueda completa.

Se integra muy bien en emacs/vim/incluso el bash-shell, y puede usarlo directamente desde el intérprete de comandos.

Para verlo en acción en el kernel de Linux, visite this

combinar eso con una herramienta para la complejidad ciclomática plugin for eclipse que calcula la complejidad de su código. Además de la complejidad ciclomática que puede manejar:

  • de McCabe Ciclomática Complejidad
  • eferente acoplamientos
  • falta de cohesión en Métodos
  • líneas de código en el método
  • número de campos
  • Numero Niveles
  • Número de locales en el alcance
  • Número de Para
  • metros
  • serie de declaraciones
  • Métodos tabuladas por clase

... y que debe tener todo lo que necesita.

+0

GNU global parece ser un superconjunto de ctags, y tiene mucha de la funcionalidad de cscope. Sin embargo, todavía estoy tratando de descubrir cómo mostrar las funciones donde, por ejemplo, se usa una determinada struct o typedef. –

+0

Sería genial si [GNU Global fuera compatible directamente con Eclipse] (https://bugs.eclipse.org/bugs/show_bug.cgi?id=129278). –

Cuestiones relacionadas