2008-11-26 20 views
51

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 usanIdentificación de código muerto (C++)

Estoy buscando una herramienta que identifique esto por análisis estático.

Esta pregunta: Dead code detection in legacy C/C++ project 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 -Wunreachable. 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?

+0

Muy interesado en escuchar respuestas, pero no tengo nada más que aportar que un voto alternativo. :) –

+0

Me preguntaba exactamente lo mismo el otro día. – Coincoin

+0

Yo también. Suena como una oportunidad de negocio ... – NotMe

Respuesta

6

Querrá algo similar a QA-C++ (http://www.programmingresearch.com/QACPP_MAIN.html), también consulte 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 detecta el 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 le gustaría poder encontrar otros usos para la herramienta.

3

No conozco Visual C, y también he recomendado las herramientas de cobertura específica de -Wunreachable-code. Como solución para su situación me gustaría probar el siguiente:

  1. Hacer con ctags (o Programm similar) una lista de todos sus símbolos en su fuente
  2. Habilitar en su compilador la eliminación de código muerto (yo supongo que predeterminado)
  3. Habilite las optimizaciones de todo el programa/tiempo de enlace (para que sepa que las funciones no usadas en sus módulos no son requeridas por otros externos y sean descartadas)
  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áfico de llamadas (p. doxygen).

0

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 enlazador/compilador es obvio ya que los puntos de interrupción no pueden establecerse allí.

Algunas notas adicionales, como comentaristas parecen no entender esto:

R: No es necesario 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á.

+0

idea genial! VS no permitirá puntos de ruptura de esta manera en una compilación de lanzamiento ... pero no creo que resalte visualmente las líneas afectadas. Sin embargo, podría ver la vista de conjunto mixto/fuente para ver qué líneas no tienen ensamblaje. –

+0

VS no permitiría puntos de interrupción en el código que no está "muerto", pero se desactiva mediante macros. Por lo tanto, uno puede terminar rompiendo algunas macros al eliminar el código aparentemente muerto. ¡Esto es peligroso! –

+0

@Ignas: ¿Y cómo, exactamente, CUALQUIER enfoque va a tratar con ese problema? – Roddy

-2

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.

+8

Esto no funcionará. ¿Qué pasa si hay una cadena de 3 funciones relacionadas, un código "callejón sin salida". La eliminación de cualquiera de las funciones hará que la compilación se rompa, incluso si el conjunto de ellas es, todas juntas, código muerto. – Cheeso

+0

Funcionará en algunos escenarios, y por lo tanto, creo que es una gran idea. – tmighty

8

Sé que los productos Gintpel's Lint (PC-Lint y) identificarán 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.

0

le sugiero que utilice un par de enfoques: 1. GCC tiene algunas banderas 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. Uso analizador estático como se sugirió antes.

Cuestiones relacionadas