¿Cómo ubico las funciones no llamadas? [cerrado]

8

Estoy mirando un código C / C ++ que parece tener funciones definidas, pero nunca utilizadas. Este es un proceso bastante tedioso para rastrear el código y verificarlo. He hecho algunas encuestas y hay varias herramientas que pueden hacer este tipo de análisis.

¿Alguien puede compartir alguna experiencia o consejos sobre qué herramientas y técnicas son mejores o si no se utilizan métodos alternativos para verificar este código?

usuario59871
fuente

Respuestas:

10

Existen algunas herramientas que pueden encontrar 'código muerto' en sus programas. Puede leer sobre ellos en los hilos de desbordamiento de pila aquí y aquí . un pequeño resumen:

use los indicadores del compilador gcc -Wunused y -Wunreachable-code, y luego use una herramienta como lcov para encontrar los métodos no utilizados.

Jakob Weisblat
fuente
3
No estoy seguro de qué facilidades para esto existen en su compilador, pero tenga en cuenta que si está utilizando la invocación basada en cualquier tipo de reflexión o RTTI, es posible llamar a un método por nombre que no esté referenciado estáticamente en ninguna parte de la base de código.
Mason Wheeler
5

¿Rastro? ¿Por qué? Simplemente coméntelos y revise el compilador. Le dirá rápidamente si comentó alguna función a la que se hizo referencia en otro lugar.

DeadMG
fuente
3
Es importante tener en cuenta que esto solo funcionará en lenguajes compilados y no en idiomas interpretados como PHP. Además, no es práctico para ningún proyecto grande, ya que podría llevarle días comentar / descomentar todos los métodos y verificarlos.
Davor Ždralo
1
Él especifica claramente que está en C ++. La reconstrucción incremental es extremadamente rápida: si todo lo que ha hecho es comentar un método en un archivo fuente, el enlazador puede decirle muy pronto.
DeadMG
En C esto debería funcionar principalmente. Pero hay complicaciones como el código que usa DEFINE para cambiar entre diferentes implementaciones. En C ++, eso no funcionará de manera confiable debido a la sobrecarga de funciones, la especialización de plantillas y probablemente un par de otras características.
CodesInChaos
2

Si está buscando activamente código no utilizado, use algo sugerido por Jake223 .

Pero, si simplemente se topa con algún código que parece no estar usado, puede hacer una búsqueda del nombre del método en su base de código. Si es un método privado, su trabajo es fácil, busque solo en la clase actual. Si es un método público, busca todo. Si es una clase completa, busque su nombre en todo su código.

¿No golpear? Perfecto. Eliminar el código y ejecutar pruebas . Tienes pruebas, ¿no? Luego, confirme los cambios en su sistema de versión de documentos . Usas uno, ¿no? De esa manera, si descubre, alguna vez, que lo necesita de nuevo, simplemente revierte un cambio.

Eliminar el código debería ser algo que haces todos los días. Tal vez refactorice algún código y elimine el antiguo. O encuentre el código antiguo no utilizado y elimínelo. E incluso si no tiene copias de seguridad, ¿qué tan difícil es reescribir una función o dos? Y la segunda vez seguramente los escribirás mejor que antes.

Patkos Csaba
fuente
+1 por sugerir el proceso bueno, anticuado y tedioso de buscar manualmente los nombres de las funciones. No es muy divertido, ¡pero funciona!
1
Y tampoco es tan tedioso. Cualquier IDE moderno puede buscar de manera muy inteligente cualquier texto. Además, para C, C ++, Java e incluso hasta cierto punto para PHP, puede hacer clic derecho en una función y presionar "Buscar uso".
Patkos Csaba
0

A menos que esté buscando problemas (es decir, sabe que deberían llamarse) por qué molestarse. Si no se llaman genuinamente, probablemente serán eliminados por el enlazador, y en cualquier caso el espacio desperdiciado no es significativo. Por otro lado, si los elimina y luego descubre que eran necesarios (tal vez en alguna configuración del compilador que no conocía), tendrá más trabajo para recuperarlos. Esto es especialmente difícil si la eliminación y el redescubrimiento están separados por mucho tiempo.

ddyer
fuente
44
La razón es que si no se llaman, entonces está manteniendo un código que no debería mantenerse y, por lo tanto, desperdiciando un valioso tiempo de ingeniería.
Michael Kohne
Cuando está trabajando en algo, sí, habrá muchas funciones no solicitadas, por lo que es posible que deba mantenerlas disponibles incluso si su compilador le advierte que no deberían existir. Una buena idea sería comentarlos si es menos probable que se usen. Pero agregue un marcador claro que indique que este código no es basura, agregue una fecha y, si es parte de un equipo, a quién contactar antes de limpiarlos.
DPD
Según DO-178, las funciones no utilizadas que no están justificadas por el diseño no deberían estar presentes.
jinawee
0

Mi IDE de elección es Eclipse, y aunque es torpe y un poco difícil de configurar al principio, vale la pena el esfuerzo teniendo en cuenta todas las herramientas que obtengo. Una de esas herramientas (y no tengo idea de cuál es su nombre oficial) le informa sobre el código no utilizado, como clases, funciones, variables, etc. El IDE simplemente muestra una línea amarilla debajo de la declaración. No estoy 100% seguro de si esto funciona con proyectos de varios archivos, ¡pero siempre puedes intentarlo!

Zach Dziura
fuente
0

Los IDE generalmente tienen esta característica bien implementada y funciona de manera predeterminada (por lo general, se puede desactivar).

Cualquiera sea el método que elija de las otras respuestas para encontrar el código muerto, siempre tenga en cuenta los problemas de reflexión. Se puede acceder a algunos métodos / campos solo a través de la reflexión. Eliminar esos métodos no activará ninguna alarma, excepto en tiempo de ejecución.

Si tiene pruebas (buenas) escritas para sus proyectos, serán de gran valor en esta situación.

Radu Murzea
fuente
0

Puede usar Cppcheck para este propósito:

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

fuente