pseudocodigo - Obtención del gráfico de flujo de control del código ANSI C
descargar visustin (2)
Estoy construyendo una herramienta para probar aplicaciones ansi c. Simplemente cargue el código, vea el gráfico de flujo de control, ejecute la prueba, marque todos los vértices que fueron golpeados. Intento crear CFG yo solo desde el código de análisis. Desafortunadamente, se arruina si el código está anidado. GCC ofrece la posibilidad de obtener CFG del código compilado. Podría escribir analizador para su salida, pero necesito números de línea para establecer puntos de corte. ¿Hay -fdump-tree-cfg
forma de obtener números de línea cuando se -fdump-tree-cfg
gráfico de flujo de control con -fdump-tree-cfg
o -fdump-tree-vcg
?
Así que investigué un poco más y no es difícil obtener números de línea para los nodos. Simplemente agregue la opción de lineno
a una de esas opciones para obtenerla. Entonces usa -fdump-tree-cfg-lineno
o -fdump-tree-vcg-lineno
. Me tomó algo de tiempo comprobar si esos números son confiables . En el caso del gráfico en formato VCG , la etiqueta de cada nodo contiene dos números . Esos son los números de línea para el inicio y el final de la porción de código representada por este nodo.
Para el gráfico de flujo de control de un programa C, puede ver los analizadores de Python existentes para C:
- PyCParser
- pycparser
- pyclibrary (tenedor de pyclibrary )
- joern
- Generador y analizador de gráfico de flujo de control CoFlo C / C ++
Los gráficos de llamada son una construcción estrechamente relacionada para controlar los gráficos de flujo. Hay varios enfoques disponibles para crear gráficos de llamadas (dependencias de funciones) para el código C. Esto podría resultar de ayuda para progresar con la generación de gráficos de flujo de control. Formas de crear gráficos de dependencia en C:
Usando cflow :
- cflow + pycflow2dot + dot (GPL, BSD) cflow es robusto, porque puede manejar código que no puede compilar, por ejemplo, falta incluir. Si las directivas de preprocesador se usan mucho, puede necesitar la opción
--cpp
para preprocesar el código. - cflow + cflow2dot + dot (GPL v2, GPL v3, licencia pública de Eclipse (EPL) v1) (tenga en cuenta que cflow2dot necesita una reparación de ruta antes de que funcione)
- cflow + cflow2dot.bash (GPL v2 ,? )
- cflow + cflow2vcg (GPL v2, GPL v2)
- cflow mejorado (GPL v2) con lista para excluir símbolos del gráfico
- cflow + pycflow2dot + dot (GPL, BSD) cflow es robusto, porque puede manejar código que no puede compilar, por ejemplo, falta incluir. Si las directivas de preprocesador se usan mucho, puede necesitar la opción
Usando cscope :
- cscope (BSD)
- cscope + callgraphviz + dot + xdot
- cscope + vim CCTree (C Call-Tree Explorer)
- cscope + ccglue
- cscope + CodeQuery para C, C ++, Python y Java
- productor cscope + Python html
- cscope + calltree.sh
ncc (flujo similar)
- KCachegrind (espectador de dependencia de KDE)
- Calltree
Desafortunadamente, las siguientes herramientas requieren que el código sea compilable, ya que dependen de la salida de gcc:
- CodeViz (GPL v2) (punto débil: necesita una fuente compilable, porque usa gcc para volcar archivos cdepn)
- gcc + egypt + dot (GPL v *, Perl = GPL | Licencia artística, EPL v1) (
egypt
usagcc
para producirRTL
, por lo que falla para cualquier código fuente defectuoso, o incluso en caso de que solo quiera enfocarse en un solo archivo de un proyecto más grande. Por lo tanto, no es muy útil en comparación con lascflow
de herramientas basadas encflow
decflow
más robustas. Tenga en cuenta que egipto tiene por defecto un buen soporte para excluir llamadas de biblioteca del gráfico, para hacerlo más limpio.
Además, los gráficos de dependencia de archivos para C / C ++ se pueden crear con crowfood
.