8
votes

Existe-t-il un moyen d'identifier toute la variable globale inutilisée dans un projet C?

Je nettoie certains Code C. Il y a des variables globales partout, mais toutes ne sont pas utilisées. Je veux nettoyer ceux-ci. Mais c'est trop de travail pour les tester un par un. Est-il facile de le faire?


3 commentaires

La plupart des compilateurs génèrent des avertissements pour ce genre de chose. Essayez d'allumer le niveau d'avertissement au maximum.


VOIDSTAR: Comment un compilateur peut-il faire cela pour un global? Il ne voit que l'une des unités de compilation à la fois.


Commenter la déclaration / définition de la variable et voyez si vous obtenez des erreurs?


6 Réponses :


3
votes

S'ils ne sont utilisés que dans le fichier, vous pouvez les déclarer «statique» et GCC mettra en garde s'ils ne sont jamais utilisés.

S'ils sont utilisés à partir de plusieurs fichiers ... Je ne sais pas comment vous pouvez détecter cela, autrement que grepping ou utiliser une IDE, car ils apparaîtront en tant que symboles de liaison et pouvaient être accessibles en théorie par n'importe quel code que Liens avec votre code ...


0 commentaires

0
votes

DOXYGEN peut être en mesure de vous donner une liste d'utilisations pour les variables globales.


0 commentaires

2
votes

facile? Non. Pour une variable globale X, vous devez numériser chaque unité de compilation dans votre code pour un accès potentiel à X (une lecture, une écriture ou une génération d'une référence). S'il n'y a pas de tels accès, vous pouvez être raisonnablement sûr (vous n'avez aucun code de montage, non?) Que X n'est pas utilisé.

Il est peut-être même le cas que x est référencé de l'une des manières ci-dessus, mais n'a aucun effet réel sur le programme (par exemple, X est lu mais ignore, écrit mais non lu , adresse prise mais jamais déréférencée). Cela rend x effectivement mort. Déterminer cela nécessite une analyse de flux de données globale.


0 commentaires

7
votes

Vous pouvez générer une liste de toutes les variables globales de votre répertoire à l'aide de la commande très utile CTAGS (1) avec l'option -x ligne de commande: xxx

Ceci peut être combiné à la commande gid (1) également utile (1) (en supposant que vous exécutez mkid (1) sur vos sources d'abord) : xxx

Cela vous donne une liste utile de laquelle les fichiers utilisent quels globaux: xxx

Ce n'est pas parfait ( Comme IRA souligne ), mais cela devrait être un bon départ.


0 commentaires

3
votes

cette réponse s'applique à la question initiale. La question a ensuite été modifiée.

Il est impossible en principe de déterminer si une variable globale est utilisée ou nécessaire. Les constructeurs peuvent avoir des effets secondaires, donc même si un global n'est jamais accessible, il peut encore être nécessaire.

histoire vraie: le programmeur qui restera nommé supprimé une "inutilisée" mondiale d'une demande de production. Malheureusement, le constructeur de cette mémoire globale allouée d'un allocator qui initialise la première allocation.

à la suite de lui supprimer le global non utilisé, l'objet suivant créé à l'aide de cet allocator a provoqué l'initialisation de l'allocator. Malheureusement, l'initialisation n'était pas du thread-coffre-fort (et était clairement documentée en tant que telle) - L'objectif de la GLOBAL était de s'assurer qu'il a été initialisé avant la création de tout thread.

Disons simplement qu'il y avait de très mauvaises conséquences (impliquant le plus grand client de cette société - une agence gouvernementale bien connue de trois lettres) et laissez-la à cela.

Un être humain doit faire la détermination qu'un global n'a pas besoin d'être créé simplement parce qu'il n'est pas utilisé, ce qui peut être une décision remarquablement compliquée de faire.


4 commentaires

Ah oui, la joie des variables d'écriture uniquement. Ou des emplacements d'E / S en écriture en écriture de mémoire.


La question est tagged c . Qu'est-ce qu'un "constructeur"?


Keith Thompson: OP dit "Je nettoie un code C / C ++". D'accord, sa balise ne dit que "C".


Je suis d'accord. Je l'ai fait trop compliqué en disant son projet C / C ++. J'ai changé le titre.



1
votes

(@ ChrisluTz a posté cette idée comme un commentaire, mais j'y ai pensé avant de lire le commentaire, donc je vais le poster de toute façon. Je vais essayer d'ajouter de la valeur en expansigeant dessus.)

Dans une copie séparée de votre code source, commencez les déclarations de toutes vos variables globales et tout recompiler. Comparez la liste des variables que vous avez commentées à celles mentionnées dans les messages d'erreur du compilateur. Tout ce qui n'est pas mentionné dans un message d'erreur n'est pas utilisé.

Notez que votre processus de construction pourrait ne pas essayer de construire tout de certaines compilations échoue, afin de pouvoir vous donner des résultats incomplets.

Une approche légèrement différente qui évite que ce problème est une itérative: commenter tous vos globaux, essayez de construire, puis déconnecte les déclarations de tout ce que le compilateur s'est plaint. Itérer jusqu'à ce que vous obteniez une construction propre et voyez ce qui est toujours commenté.


1 commentaires

PREPENDUX extern et omission des initialisations peuvent produire moins de messages d'erreur pour labourer. En outre, je me demande s'il y a un commutateur d'avertissement (sinon pour le compilateur, que pour la liaison) qui pourrait avertir non seulement des variables locales inutilisées, mais également des variables mondiales inutilisées.