visual studio que microsoft library descargar c++ visual-c++ legacy

studio - Encontrar "código muerto" en una gran aplicación heredada de C++



visual studio 2012 (8)

Actualmente estoy trabajando en una aplicación 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.

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

¿Cómo encuentras el código muerto en tu proyecto?


Aunque no específicamente para código muerto, encontré el Source Navigator

http://sourcenav.berlios.de/

bastante útil, aunque engorroso de configurar y un poco problemático. Eso fue hace un año en Linux (Fedora).


Creo que tu 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.

Ya que está usando VisualStudio, podría proporcionarle dos enlaces que podría considerar usar:

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

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


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


Nada supera 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.


Puede usar Cppcheck para este propósito:

$ 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.


Querrá utilizar una herramienta de análisis estático

El principal problema con el que me he encontrado es que debes tener cuidado de que las bibliotecas no se utilicen desde ningún lugar que no controlas o tienes. 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.


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 obtendrás.


Vea nuestra cobertura de prueba SD C ++ .

Debe hacer muchas pruebas dinámicas para ejercer 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.