Identification des fonctions inutilisées en C/C ++

Possible Duplicate:
Finding “dead code” in a large C++ legacy application

Mon projet a beaucoup de fichiers source C chacun avec beaucoup de fonctions globales. Beaucoup d'entre eux ne sont plus référencés par aucun appelant. Existe-t-il un moyen simple d'identifier lesquelles de ces fonctions ne sont référencées par personne?

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

0
En fait, je suis intéressé à apprendre comment le fichier de carte généré par le linker VC peut être utilisé à cette fin. (puisqu'il est disponible gratuitement)
ajouté l'auteur JavaMan, source
Supprimez manuellement et recompilez le code pour les fonctions douteuses.
ajouté l'auteur iammilind, source

3 Réponses

Une manière directe mais laborieuse de faire ceci est simplement d'envelopper la déclaration de fonction et les définitions de toutes les fonctions suspectes avec des directives de préprocesseur:

#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 avec la macro réelle et par conséquent, #if 0 devient #ifdef NO_OLD_FUNCTIONS - de cette façon, il est plus facile de trouver et sortez-les plus tard, une fois que vous êtes heureux, ils ne sont pas utilisés.

Naturellement, vous devrez entièrement compiler et lier le code et tout autre code qui se construit dessus.

0
ajouté
@AhmedJolani: (1) Vous soupçonnez que la fonction est inutilisée, (2) vous suivez les étapes ci-dessus (3) le compilateur vous donne des erreurs connexes ou non - donc vous détecter si la fonction est utilisée ou ne pas. C'est une procédure très utilisée.
ajouté l'auteur Component 10, source
@AhmedJolani: C'est pourquoi je l'ai décrit comme «laborieux» - mais cela fonctionne et n'implique aucun outil (coûteux). Ce n'est qu'une des nombreuses approches - n'hésitez pas à en suggérer une autre.
ajouté l'auteur Component 10, source
Cela ne détecte pas, c'est la pré-configuration et ce n'est pas ce que le demandeur voulait entendre.
ajouté l'auteur Ahmed Jolani, source
et c'est ce que vous ne voulez pas faire quand vous avez des milliers de lignes de code.
ajouté l'auteur Ahmed Jolani, source
le profilage peut être utilisé pour détecter automatiquement les fonctions inutilisées.
ajouté l'auteur Ahmed Jolani, source

I don't think that the map file will be of any use. If it's like other map files I've seen, it won't indicate where (if anywhere) a symbol is used—only where it is defined. What you can do is run dumpbin over your object files: dumpbin /relocations, for example, will in fact display every use of a symbol with an address which may need relocation (practically speaking, functions and variables with static lifetime). You then use your usual tools on the output to determine whether the function you are interested in is there or not. (As someone who has worked mostly on Unix, I've installed CygWin and would use grep. I'm not familiar with the native equivalents to the different Unix tools under Windows.)

Ce serait assez simple (en utilisant Python, ou un script similaire langue) pour écrire un petit script qui analyserait la sortie de dumpbin/symbols pour chacun de vos fichiers objet, pour obtenir les noms des toutes les fonctions que vous avez définies, puis analyse la sortie de dumpbin / relocations pour vous donner une liste des fonctions que vous utilisez, et enfin fait le diff des deux. (Microsoft semble être sorti de leur façon de rendre la sortie de dumpbin difficile à utiliser, mais ce n'est toujours pas c'est difficile; il suffit de savoir quelles lignes ignorer.)

0
ajouté

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

This question may be a duplicate of this one: Dead code detection in legacy C/C++ project

0
ajouté