Liste des fonctions C / C ++ (Analyse de code sous Unix)

Que nous conservions du code inconnu ou que nous vérifiions les détails de mise en œuvre d’un module Apache, il peut être utile de parcourir rapidement le code et de créer une vue d’ensemble de ce que nous examinons. Grep répond à la plupart de mes besoins quotidiens, mais il y a des cas où cela ne suffit pas.

Voici un exemple courant de la façon dont cela peut aider. Pour trouver la définition d’une fonction PHP qui m’intéresse, je peux taper ceci en ligne de commande:

grep -r "function myfunc" . 

Cela pourrait être adapté très rapidement au C ou au C ++ si nous connaissons le type de retour, mais les choses deviennent plus compliquées si, par exemple, je veux répertorier toutes les méthodes fournies par ma classe:

 grep "function " ./src/mine.class.php 

Puisqu’il n’y a pas de mot-clé unique qui dénote une fonction ou une méthode en C ++ et que c’est une syntaxe généralement plus complexe, je pense qu’il me faudrait un outil d’parsing de code statique, une utilisation intelligente du préprocesseur C ou une foi aveugle, que le codeur a suivi les instructions ssortingctes du code (nombre d’espaces, position des curlies, etc.) pour obtenir ce genre de résultats.

Que recommanderais-tu?

Exécutez-le à travers Doxygen. Il se plaindra du manque de commentaires, mais produira tout de même des graphiques d’appel et une liste de toutes les fonctions. Présenté en HTML avec des liens pour suivre les chemins de code.

doxygen

Ctags exubérants http://ctags.sourceforge.net/

Je ne l’ai utilisé que de temps en temps, et à partir d’un éditeur de texte, mais consultez la liste des utilitaires / outils pouvant l’utiliser:

http://ctags.sourceforge.net/tools.html

Doxygen est capable de générer une documentation HTML raisonnable et d’parsingr les commentaires. Ce n’est pas parfait, mais cela pourrait aider. Vous pouvez incorporer des balises Ctags dans votre éditeur pour vous permettre d’ accéder aux fonctions que vous recherchez.

Personnellement, j’utilise grep;)

cscope est très bon pour ce genre de chose. Contrairement à ctags, cscope fournit une interface adaptée à la recherche (ctags nécessite un éditeur).

Il suffit d’exécuter cscope dans le répertoire racine du code que vous souhaitez inspecter. Il va: créer une firebase database s’il n’y en a pas, mettre à jour la firebase database s’il y en a une, et ouvrir une interface graphique où vous pouvez interroger toutes sortes d’informations utiles

  • toutes les références à un symbole
  • définitions globales
  • fonctions appelées par une fonction
  • fonctions appelant une fonction
  • chaîne de texte
  • modèle d’expression régulière
  • un fichier
  • fichiers comprenant un fichier

ctags ne fait que le premier, “toutes les références à un symbole”.

grep '^[a-zA-Z0-9][ *]+ {[a-zA-Z0-9_]+}\([a-zA-Z0-9\,\.\-\>]\*\)$'

Est à peu près ce que vous voulez. Cela peut prendre un certain temps de jouer avec, mais correspondre à un type de retour C ++ valide, donner l’option de le faire comme pointeur, puis un nom de fonction (qui sera \ 1), parenthèses ouvertes, parameters, fermer.

Cette forme générale (return, name, (param)) devrait fonctionner sauf si vous pouvez avoir des sauts de ligne dans une déclaration de fonction.

J’utiliserais Doxygen ou un autre outil pour l’parsingr, mais si vous devez le faire rapidement et une fois, regex peut être plus facile (ou non, avec regex, vous ne le saurez jamais).