how - Identificación del código muerto(C++)
cppcheck inconclusive (6)
Tengo un gran proyecto heredado de C ++ compilado en Visual Studio 2008. Sé que hay una cantidad razonable de código "inactivo" al que no se accede desde ningún lugar: métodos que no se llaman, clases completas que no se utilizan.
Estoy buscando una herramienta que identifique esto por análisis estático .
Esta pregunta: la detección de código muerto en el proyecto heredado C / C ++ sugiere el uso de herramientas de cobertura de código. Esta no es una opción ya que la cobertura de la prueba no es lo suficientemente alta.
También menciona un código "inalcanzable". opción para gcc. Me gustaría algo similar para Visual Studio. Ya usamos la opción del enlazador / OPT: REF para eliminar el código redundante, pero esto no informa el código muerto en un nivel útil (cuando se utiliza con / VERBOSE hay más de 100.000 líneas, incluido mucho de las bibliotecas).
¿Hay alguna opción mejor que funcione bien con un proyecto de Visual Studio?
Escriba un script que elimine aleatoriamente una función (del código fuente) y recompila todo desde cero. Si aún compila, esa función era código muerto.
Un enfoque que funciona para mí, con Delphi, es habilitar la depuración y ejecutar el programa bajo el depurador.
Cuando se ejecuta un programa Delphi bajo el depurador, el IDE muestra en el margen qué líneas de código se pueden establecer como puntos de interrupción. El código que está realmente muerto, es decir, ha sido eliminado por el vinculador / compilador, es obvio ya que los puntos de interrupción no se pueden establecer allí.
Algunas notas adicionales, ya que los comentaristas parecen malinterpretar esto:
a: No necesita intentar establecer un punto de interrupción en cada línea. Simplemente abra el archivo fuente en el IDE y desplácese rápidamente a través de él. El código muerto se detecta fácilmente.
b: Esto NO es una verificación de ''cobertura de código''. No necesita ejecutar la aplicación para ver si llega a las líneas.
c: No estoy lo suficientemente familiar VS2008 por lo que no puedo decir si esta sugerencia funcionará.
Sugiero que use un par de enfoques: 1. GCC tiene algunos indicadores de compilación útiles:
-Wunused-function
-Wunused-label
-Wunused-value
-Wunused-variable
-Wunused-parameter
-Wunused-but-set-parameter
2. Cppcheck tiene algunas características útiles como:
--enable=unusedFunction
3. Use el analizador estático como se sugirió antes.
No conozco Visual C, y también he recomendado las herramientas de cobertura específica de "Código inalcanzable". Como solución para su situación, probaría lo siguiente:
- Haga con ctags (o programa similar) una lista de todos sus símbolos en su fuente
- Habilite en su compilador la eliminación del código inactivo (asumiría que está predeterminado)
- Habilite las optimizaciones de todo el programa / tiempo de enlace (para que sepa que las funciones no utilizadas en sus módulos no son requeridas por otros externos y se descartan)
- Tome los símbolos de su binario y compárelos con los símbolos de 1.
Otro enfoque podría ser alguna herramienta de generación de gráficos de llamadas (por ejemplo, doxygen).
Querrás algo similar a QA-C ++ ( http://www.programmingresearch.com/QACPP_MAIN.html ), también ver http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis para productos similares.
Está buscando una herramienta de análisis de código estático que detecte código inalcanzable; muchas pautas de codificación (como MISRA-C ++, si no me equivoco) requieren que no exista código inalcanzable. Una herramienta de análisis diseñada específicamente para hacer cumplir tal guía sería su mejor apuesta.
Y también te gustará poder encontrar otros usos para la herramienta.