Pregunta

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 lado: métodos que no se llaman, clases completas que no se usan.

Estoy buscando una herramienta que lo identifique mediante análisis estático .

Esta pregunta: Detección de código muerto en proyecto C / C ++ heredado sugiere usar herramientas de cobertura de código. Esta no es una opción ya que la cobertura de prueba simplemente no es lo suficientemente alta.

También menciona un código -Wunreachable-code. opción a gcc. Me gustaría algo similar para Visual Studio. Ya usamos la opción del vinculador / OPT: REF para eliminar el código redundante, pero esto no informa el código muerto a un nivel útil (cuando se usa con / VERBOSE hay más de 100,000 líneas, incluyendo muchas de las bibliotecas).

¿Hay alguna opción mejor que funcione bien con un proyecto de Visual Studio?

¿Fue útil?

Solución

Querrá algo similar a QA-C ++ ( http: //www.programmingresearch. com / QACPP_MAIN.html ), también vea 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 un código inalcanzable. Una herramienta de análisis diseñada específicamente para hacer cumplir esa directriz sería su mejor opción.

Y también le gustaría poder encontrar otros usos para la herramienta.

Otros consejos

Sé que los productos Gimpel's Lint ( PC-Lint y Flexelint ) identificará el código inalcanzable y los módulos no utilizados / sin referencia.

Ambos caen en la categoría de herramientas de análisis estático.

No tengo afiliación con Gimpel, solo un cliente satisfecho a largo plazo.

No conozco Visual C, y también recomendé las herramientas de cobertura específicas de códigos no alcanzables. Como solución para su situación, intentaría lo siguiente:

  1. Haga con ctags (o un programa similar) una lista de todos sus símbolos en su fuente
  2. Habilite en su compilador la eliminación del código muerto (supongo que está activado por defecto)
  3. Habilite todo el programa / optimizaciones de tiempo de enlace (para que sepa que otras funciones no utilizadas en sus módulos no son requeridas por otros externos y se descartan)
  4. 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).

Te sugiero que uses 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. Utilice el analizador estático como se sugirió anteriormente.

Un enfoque que funciona para mí, con Delphi, es habilitar la depuración y ejecutar su 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, que 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 por é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 suficientemente familiarizado con VS2008, así que no puedo decir si esta sugerencia funcionará.

O bien
1) El MSVC está infrautilizado en herramienta de análisis estático .
2) El MSVC marketplace tiene muchas herramientas que incluyen soporte para la mayoría de las herramientas gratuitas, incluido CppCheck

Necesitará la última versión de Visual Studio para aplicaciones de mercado, pero la gratuita " Edición comunitaria " tiene licencias muy indulgentes.

Escriba un script que elimine aleatoriamente una función (del código fuente) y vuelva a compilar todo desde cero. Si aún se compila, esa función era código muerto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top