¿Hay alguna manera de advertirte sobre las funciones no utilizadas?

Me gustaría encontrar funciones no utilizadas en una base de código, incluso en unidades de comstackción. Estoy usando gcc como mi comstackdor.

Aquí hay un ejemplo:

foo.c (supóngase apropiado foo.h ):

 void foo() { .... } void bar() { .... } 

main.c :

 #include  #include "foo.h" int main(void) { bar(); return 0; } 

En este ejemplo, me gustaría que me foo() no se usa foo() .

Está la -Wunused-function gcc:

-Wunused-function

Avise siempre que se declare una función estática pero no se defina o no se use una función estática no en línea. Esta advertencia es habilitada por -Wall.

pero es solo para funciones estáticas; no producirá una advertencia en el ejemplo anterior.

También aceptaré sugerencias de herramientas / scripts / otros comstackdores que puedan hacer esto por mí, aunque preferiría seguir con gcc si fuera posible.

Caolan Mc Namara , un desarrollador de LibreOffice, ha creado una pequeña herramienta para detectar este tipo de cosas en el código fuente de LibreOffice. Tenían alrededor de miles de funciones y métodos sin usar en LibreOffice. Su herramienta es un elemento clave para eliminarlos.

Se llama Callcatcher . Puede

recoger funciones / métodos definidos y restar llamados / referenciados

Funciona directamente en la salida del ensamblador y, por lo tanto, funciona solo para la architecture x86 y x86_64. Puede producir resultados como este . Puede integrarlo con su comstackción tradicional y vincular llamadas a gcc.

Caolan acepta que se convierta en un complemento de gcc.

Sé que pidió advertencias y prefiere no usar la opción de gcc, pero es realmente fácil.

Puede utilizar la optimización del enlazador (–gc-sections) para eliminar el código muerto de su aplicación.

Desde la página man de gcc:

–gc-sections –no-gc-sections Habilita la recolección de basura de las secciones de entrada no utilizadas. Se ignora en los objectives que no admiten esta opción. El comportamiento predeterminado (de no realizar esta recolección de basura) se puede restaurar especificando –no-gc-sections en la línea de comando.

–gc-sections decide qué secciones de entrada se usan al examinar símbolos y reubicaciones. Se mantendrá la sección que contiene el símbolo de entrada y todas las secciones que contienen símbolos indefinidos en la línea de comandos, al igual que las secciones que contienen símbolos referenciados por objetos dynamics. Tenga en cuenta que al comstackr bibliotecas compartidas, el vinculador debe suponer que se hace referencia a cualquier símbolo visible. Una vez que se ha determinado este conjunto inicial de secciones, el vinculador marca recursivamente como usado cualquier sección referenciada por sus reubicaciones. Ver –entry y –indefinido.

Esta opción se puede configurar al hacer un enlace parcial (habilitado con la opción -r). En este caso, la raíz de los símbolos mantenidos debe especificarse explícitamente mediante una opción –entry o –undefined o mediante un comando “ENTRY” en el script del enlazador.

En primer lugar, si desea que tales advertencias se -flto el progtwig, sin duda necesita el -flto , ya que debe resolverse en el momento del enlace, no en el momento de la comstackción de cada unidad individual. Pero no creo que GCC proporcione tales advertencias, incluso de esta manera.

Entonces, en el caso general, entendería que no sería conveniente proporcionarlo (porque, por ejemplo, la libc vinculada probablemente tenga muchas funciones que su aplicación no necesita). Además, una aplicación podría usar trucos dlsym para alcanzar una función aparentemente no llamada …

Sin embargo, es un buen ejemplo de un caso de uso potencial para un complemento de GCC o extensión MELT , que registraría cada ocurrencia de llamada en algún lugar, con una utilidad posterior encontrando todas las funciones no llamadas. (Pero codificar un complemento o una extensión MELT para GCC te llevará al menos varios días, porque necesitarás entender las partes internas de GCC).

También podría usar técnicas de creación de perfiles para obtener las funciones dinámicas no utilizadas (no llamadas).

No dude en preguntarme más por correo electrónico.

Eclipse CDT tiene un análisis de código, que puede configurar para marcar las funciones estáticas no utilizadas y las declaraciones de funciones no utilizadas (entre otras cosas útiles). Como ya se dijo, solo el enlazador podía decir que cierta función (no estática) no se usaba en ciertos binarios …

gprof es la solución más simple, supongo. -pg el progtwig de ejemplo que has presentado con la opción -pg para que podamos obtener el gmon.out cuando ejecutamos a.out (que gprof puede usar más adelante) y luego finalmente ejecuté gprof -z a.out gmon.out | tee output.txt gprof -z a.out gmon.out | tee output.txt . ¡Podría encontrar tu función foo en la lista no utilizada! es decir, llamado 0 veces. -z es la opción que debe usar junto con gprof para rastrear las rutinas no utilizadas.

¡Gracias a este hilo por el puntero apropiado!

PD: gprof vomitó una serie de otras funciones de la biblioteca no utilizadas junto con su función no utilizada foo . En serio, no sé cómo filtrar esto 🙂