2010-03-04 13 views
42

Actualmente estoy trabajando en una aplicación de C++ grande y antigua que ha tenido muchos desarrolladores antes que yo. Hay un montón de "código muerto" en el proyecto, clases y funciones que ya nadie usa.Encontrar "código muerto" en una gran aplicación heredada de C++

¿Qué herramientas están disponibles para que C++ haga un análisis de la base de código grande para detectar y refactorizar el código muerto? Nota: No estoy hablando de la herramienta de cobertura de prueba como gcov.

¿Cómo se encuentra el código muerto en su proyecto?

+2

utilizan algún tipo de herramienta de cobertura de código. Iba a sugerir 'gcov' pero no sé qué está disponible en VC. –

+0

Hemos usado Bullseye con éxito. Aquí hay un enlace para una copia de evaluación. http://www.bullseye.com/evaluation.html –

+0

Esta pregunta tiene una gran solución para gcc: [¿Hay alguna manera de hacer que gcc advierta sobre las funciones no utilizadas?] (http://stackoverflow.com/questions/9091397/is-there-a-way-to-get-gcc-to-warn-about-unused-functions) –

Respuesta

24

Usted querrá utilizar una herramienta de análisis estático

El principal Gotcha me he encontrado es que debe tener cuidado de que las bibliotecas no se utilicen desde un lugar que no sea c ontrol/tener. Si elimina una función de una clase que se utiliza al hacer referencia a una biblioteca en su proyecto, puede romper algo que no sabía que usaba el código.

0

Aunque no específicamente para el código muerto, he encontrado la Fuente Navigator

http://sourcenav.berlios.de/

bastante útil, aunque engorroso de instalar y un poco buggy. Eso fue hace un año en Linux (Fedora).

2

Un enfoque es utilizar el elemento del menú contextual "Buscar todas las referencias" en los nombres de clases y funciones. Si una clase/función solo se referencia en sí misma, es casi seguro que se trata de un código muerto.

Otro enfoque, basado en la misma idea, es eliminar (comentar) archivos/funciones del proyecto y ver qué mensajes de error recibirá.

+0

Este enfoque es definitivamente ** no ** aplicable para proyectos grandes. –

3

Creo que su mejor opción sería probablemente una herramienta de cobertura. Hay mucho para * nix y windows. Si tiene pruebas unitarias, es fácil: si tiene una cobertura de prueba baja, entonces el código descubierto ya está muerto o no se ha probado todavía (de todas maneras, quiere ambas partes de esta información). Si no tiene pruebas unitarias, cree su aplicación con la instrumentación provista por una de esas herramientas, ejecútela a través de algunas rutas de ejecución (debería ser lo ideal) y vea el informe. Obtienes la misma información que con las pruebas unitarias, solo requerirá mucho más trabajo.

Dado que está utilizando VisualStudio, lo que podría proporcionar par de enlaces, que podría considerar el uso:

Ninguno de ellos es libre, ni siquiera barato , pero el resultado por lo general vale la pena.

En * nix-como plataformas gcov junto con herramientas como zcov o lcov es una gran opción.

2

Nada gana la familiaridad con el código.Excepto tal vez una poda rigurosa a medida que uno avanza.

A veces, lo que parece ser madera muerta se usa como andamio para pruebas unitarias, etc. o parece estar vivo simplemente porque las pruebas unitarias heredadas lo ejercen, pero nunca se ejerce fuera de las pruebas. Hace poco eliminé más de 1000 LOC que soportaban traductores externos de modelos CAD, teníamos pruebas que invocaban a esos traductores externos, pero esos traductores llevaban más de 8 años sin soporte y no había forma de que un usuario de la aplicación, aunque lo deseara, podría alguna vez invocarlos.

A menos que uno sea riguroso en deshacerse de la madera muerta, uno encontrará que su equipo mantiene las cosas durante años.

+0

Incluso con la poda en el camino, las cosas se deslizan a través de las grietas, todavía hay un muy buen caso de uso para poder encontrar el código muerto a nivel mundial. – ideasman42

0

Vea nuestro SD C++ Test Coverage.

Debe realizar muchas pruebas dinámicas para aplicar el código, para asegurarse de alcanzar la cantidad máxima de cobertura. El código "no cubierto" puede estar o no muerto; quizás simplemente no tengas un caso de prueba para ejercerlo.

3

Caolán McNamara's callcatcher se usa muy eficazmente dentro del proyecto LibreOffice (~ 6 MLOC) para encontrar el código muerto.

4

Se puede utilizar para este propósito Cppcheck:

$ cppcheck --enable=unusedFunction . 
Checking 2380153.c... 
1/2 files checked 0% done 
Checking main.c... 
2/2 files checked 0% done 
[2380153.c:1]: (style) The function '2380153' is never used. 
+0

No publiques la misma respuesta a varias preguntas. Si la misma información realmente responde ambas preguntas, entonces una pregunta (generalmente la más reciente) debe cerrarse como un duplicado de la otra. Puede indicar esto al [votar para cerrarlo como un duplicado] (http://stackoverflow.com/help/privileges/close-questions) o, si no tiene suficiente reputación para eso, [levantar una bandera] (http://stackoverflow.com/help/privileges/flag-posts) para indicar que es un duplicado. De lo contrario, asegúrese de adaptar su respuesta a * esta * pregunta y no solo pegue la misma respuesta en varios lugares. –

Cuestiones relacionadas