Identification des fonctions non utilisées en C / C ++

Dupliquer possible:
Recherche de «code mort» dans une grande application héritée C ++

Mon projet contient de nombreux fichiers source C, chacun comportant de nombreuses fonctions globales. Beaucoup d’entre eux ne sont plus référencés par aucun appelant. Existe-t-il un moyen simple d’identifier laquelle de ces fonctions n’est référencée par personne?

Le fichier de carte généré par VC semble être utile. Mais je ne sais pas exactement comment / quand un nom de fonction est répertorié dans le fichier map.

Vous pouvez utiliser CCCC (gratuit, open source) qui vous donne de nombreuses statistiques sur votre programme. Une autre option serait Coverity (non gratuit).

Cette question est peut-être une copie de celle-ci: Détection de code mort dans un projet C / C ++ hérité

Je ne pense pas que le fichier de carte sera d’aucune utilité. Si c’est comme les autres fichiers de carte que j’ai vus, cela n’indiquera pas où (si n’importe où) un symbole est utilisé, mais seulement où il est défini. Ce que vous pouvez faire est d’exécuter dumpbin sur vos fichiers d’object: dumpbin /relocations , par exemple, affichera en fait chaque utilisation d’un symbole avec une adresse pouvant nécessiter un déplacement (en pratique, des fonctions et des variables avec une durée de vie statique). Vous utilisez ensuite vos outils habituels sur la sortie pour déterminer si la fonction qui vous intéresse s’y trouve ou non. (En tant que personne ayant principalement travaillé sur Unix, j’ai installé CygWin et utiliserais grep . Je ne connais pas les équivalents natifs des différents outils Unix sous Windows.)

Il serait assez simple (en utilisant Python ou un langage de script similaire) d’écrire un petit script qui parsingrait la sortie de dumpbin /symbols pour chacun de vos fichiers object, pour obtenir le nom de toutes les fonctions que vous avez définies, puis parsing la sortie de dumpbin /relocations pour vous donner une liste des fonctions que vous utilisez, et fait enfin le diff des deux. (Microsoft semble avoir fait de son dumpbin pour rendre la sortie de dumpbin difficile à utiliser, mais ce n’est toujours pas si difficile; vous devez simplement savoir quelles lignes ignorer.)

Une façon simple mais laborieuse de procéder consiste simplement à envelopper la déclaration de fonction et les définitions de toutes les fonctions suspectes avec des directives de pré-traitement:

 #if 0 void old_func(); #endif 

 #if 0 void old_func() { } #endif 

ou si vous voulez avoir plus de contrôle, vous pouvez remplacer 0 par et votre propre macro pour que #ifdef NO_OLD_FUNCTIONS devienne #ifdef NO_OLD_FUNCTIONS – de cette façon, il est plus facile de les trouver et de les supprimer de manière permanente une fois que vous êtes heureux. ne sont pas utilisés.

Naturellement, vous aurez besoin de comstackr et de lier complètement le code et tout autre code qui le construit.