52 votes

Existe-t-il un moyen d’être averti des fonctions inutilisées?

Je voudrais trouver les fonctions inutilisées dans une base de code - y compris à travers des compilations unités. Je suis à l'aide de gcc que mon compilateur.

Voici un exemple:

foo.c (à supposer approprié foo.h):

void foo() {
   ....
}

void bar() {
   ....
}

principal.c:

#include <stdio.h>
#include "foo.h"  

int main(void)  {
    bar();
    return 0;
}

Dans cet exemple, je voudrais avoir averti foo() n'est pas utilisée.

Il est l' -Wunused-function gcc avec l'option:

-Wunused-function

Avertir à chaque fois qu'une fonction statique est déclarée, mais pas définie ou non en ligne statique de la fonction n'est pas utilisée. Cet avertissement est activé par le Mur.

mais c'est seulement pour des fonctions statiques - qu'il ne produira pas un avertissement sur l'exemple ci-dessus.

Je vais aussi accepter les suggestions d'outils/scripts/autres compilateurs qui peuvent le faire pour moi - même si je préfère le bâton avec gcc, si possible.

52voto

Coren Points 3679

Caolan Mc Namara, un LibreOffice développeur, a fait un petit outil pour détecter ce type de chose dans LibreOffice code source. Ils avaient autour de milliers de fonctions et méthodes inutilisés dans LibreOffice. Son outil est un élément clé pour les retirer.

Il est appelé callcatcher. Il peut :

recueillir des fonctions/méthodes définies et soustraire appelé référencées/

Il fonctionne directement sur l'assembleur de sortie et donc, il ne fonctionne que pour les architectures x86 et x86_64 architecture. Elle peut produire comme cela. Vous pouvez l'intégrer à votre traditionnelle compilation et la liaison de l'appel à gcc.

Caolan convient qu'il devrait devenir un gcc plugin.

7voto

eyalm Points 1608

Je sais que vous avez demandé pour les avertissements et préfère ne pas utiliser gcc avec l'option mais il est vraiment facile.

Vous pouvez utiliser l'éditeur de liens d'optimisation (--gc-sections) afin de supprimer les morts que le code de votre application.

De gcc de l'homme page:

--gc-sections --no-gc-sections Permettre la collecte des ordures de la partie inutilisée des sections d'entrée. Il est ignoré sur des cibles qui ne prennent pas en charge cette option. Le comportement par défaut (pas d'effectuer cette collecte de déchets) peuvent être restaurées en spécifiant l'option --no-gc-sections sur la ligne de commande.

--gc-sections qui décide des sections d'entrée sont utilisés par l'examen de symboles et de délocalisations. La section contenant l'entrée du symbole et de toutes les sections contenant des symboles indéfinis sur la ligne de commande sera conservée, tout comme les sections contenant des symboles référencés par des objets dynamiques. Notez que lors de la construction des bibliothèques partagées, l'éditeur de liens doit considérer que tout un symbole visible est référencé. Une fois cette première série d'articles a été déterminée, l'éditeur de liens de manière récursive marques comme utilisé tout l'article référencé par leurs délocalisations. Voir --entry --et indéfini.

Cette option peut être définie lors d'une partielle lien (activé avec l'option-r). Dans ce cas, la racine de symboles conservés doivent être explicitement spécifié par --entrée ou --undefined option ou par une "ENTRÉE" de commande dans l'éditeur de liens de script.

4voto

Basile Starynkevitch Points 67055

Tout d'abord, si vous voulez, tels que les avertissements de l'ensemble du programme, vous avez certainement besoin de l' -flto drapeau, car il devrait être résolue au moment de la liaison, et non pas au moment de la compilation de chaque unité. Mais je ne pense pas que GCC fournir de tels avertissements, même de cette façon.

Ensuite, dans le cas général, je le comprends, il ne sera pas sage de fournir lui (parce que par exemple la reliée libc a probablement beaucoup de fonctions de votre application n'avez pas besoin). Aussi, une application peut utiliser dlsym astuces pour parvenir à un apparemment injustifiées de la fonction...

Cependant, il est un bon exemple de potentiel en cas d'utilisation de GCC plugin ou faire FONDRE extension, ce qui permettrait d'enregistrer chaque appel apparition quelque part, avec un plus tard, l'utilitaire de recherche de tous les non-fonctions. (Mais le codage d'un plugin ou d'un prolongement FONDRE pour GCC va vous prendre plusieurs jours au moins, parce que vous aurez besoin de comprendre GCC internes).

Vous pouvez également utiliser les techniques de profilage pour obtenir l'dynamiquement inutilisés (pas appelé) de fonctions.

N'hésitez pas à demander plus de moi par e-mail.

4voto

Pavan Manjunath Points 10853

gprof est la solution la plus simple je pense. J'ai compilé l'exemple de programme que vous avez mis en place avec l' -pg option, de sorte que nous obtenons l' gmon.out quand nous courons a.out (ce qui gprof pouvez utiliser plus tard) et puis j'ai finalement couru gprof -z a.out gmon.out | tee output.txt . J'ai pu trouver votre fonction foo dans le solde non utilisé de la liste! j'.e appelés 0 temps. -z est l'option que vous devriez utiliser avec gprof de piste inutilisés routines.

Grâce à ce thread pour le pointeur de la!

PS: gprof a jeté une flopée d'autres inutilisés de la bibliothèque de fonctions avec votre inutilisés fonction foo. J'ai sérieusement ne sais pas comment le filtrage :)

1voto

dbrank0 Points 4024

Eclipse CDT dispose d'une analyse de code, que vous pouvez définir pour marquer les fonctions statiques non utilisées et les déclarations de fonctions non utilisées (entre autres choses utiles). Comme déjà dit, seul l'éditeur de liens pouvait dire que certaines fonctions (non statiques) n'étaient pas utilisées dans certains fichiers binaires ...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X