¿Existe una herramienta para extraer todas las rutas posibles entre dos ubicaciones en el código?

Estoy depurando un error en el código C++ que no escribí. Sé que entre la ubicación A y B en la fuente, sucedió algo que produjo esta salida inesperada. Esta es a menudo la única información que tengo para empezar.

Se me ocurrió que la mayor parte del tiempo que dedico a rastrear errores no es tratar de comprender la lógica, sino tratar de identificar las posibles rutas entre A y B. ¿Existe alguna herramienta que pueda hacer esto por mí?

Detalles específicos:

  • Funciona con código fuente C++
  • Proporciona información de todas las rutas posibles de A a B que se especifica en el código
  • No requiere el uso de puntos de interrupción. Es decir, puede analizar el código sin ejecutarlo.
  • (Preferiblemente) una pequeña aplicación
"preferiblemente una pequeña aplicación"? Tiene que contener un motor de análisis y un analizador C++ completo. "Pequeño" no es el adjetivo correcto aquí.
Utilice cualquiera de los muchos programas gratuitos de todo el árbol e ignore las partes que no desea. Esa es la forma más rápida y sencilla.

Respuestas (2)

Dudo que vaya a una herramienta que hace exactamente lo que quiere fuera de la caja. Puede recopilar esta información de un "analizador" de C++ que sepa cómo resolver los nombres de C++ por completo (eso significa un front-end completo de C++).

Nuestro kit de herramientas de reingeniería de software DMS con su C++ Front End puede proporcionar esta información.

El par comprende un motor de análisis estático y de análisis sintáctico completo de C ++, que puede calcular flujos de control (que OP quiere) y flujos de datos (que OP no necesita) y gráficos de llamadas. Consulte el ejemplo de SVG de control/flujo de datos en la página del sitio.

Con esa información de flujo de control, OP podría codificar un gráfico de flujo de control que comience en el "punto A" y encuentre diferentes rutas hasta el "punto B". Esta será una búsqueda en profundidad bastante sencilla en el gráfico de flujo de control si los puntos A y B están en la misma función. Si están en diferentes funciones fA y fB, necesitará encontrar algún padre-llamador S compartido de fA y fB, de modo que S llame a fA, y luego rastrear la ruta del flujo de control de A a B a través del gráfico de llamadas. Esto es más complicado, pero probablemente solo sean unas pocas páginas de código si sabe lo que está haciendo. Debe ser obvio que aprender a usar una herramienta como DMS no es algo que se hace en la tarde; cualquier cosa que pueda manejar C++ ya es muy sofisticada y maneja toneladas de detalles.

Resumen:

  • Analizador completo para varios dialectos de C ++, incluidos GCC y MS, hasta C ++ 14 (con C ++ 17 en proceso)
  • Construye gráficos de control local de funciones (y flujo de datos)
  • Puede construir un árbol de llamadas
  • Requiere código personalizado para extraer datos de interés sobre los programas de C++

Probablemente puedas personalizar Clang o GCC para hacer esto también, pero sospecho que no es una tarea fácil y te enfrentarás al mismo tipo de problema de curva de aprendizaje que enfrentarías con DMS, por las mismas razones. GCC tiene la reputación de ser muy difícil trabajar con él. No tengo experiencia con Clang; No creo que calcule gráficos de flujo de control en el código C++, sino en el back-end de LLVM, por lo que tendría que calcular el flujo de control en los gráficos LLVM y luego retroceder al código fuente de C++.

Puede probar CppDepend para rastrear todas las rutas posibles entre A y B. El DSM y el gráfico de dependencia se proporcionan para comprender las dependencias entre dos o muchos elementos.