Génération d’un graphe d’appel pour le code C

J’écris un outil et je dois générer le callgraph pour certains projets C. J’ai réussi à générer le graphe d’appel d’un fichier à l’aide de clang, mais je n’ai pas été en mesure de savoir comment générer le graphe d’appel sur l’ensemble du projet, qui contient des dizaines de fichiers d’en-tête et de source.

Tout outil capable de générer le graphe d’appel dans un fichier pouvant être analysé convient parfaitement. Une bibliothèque utilisable sera mieux.

    Il convient également de mentionner l’excellent GNU cflow :

    GNU cflow parsing une collection de fichiers source C et imprime un graphique, en traçant les stream de contrôle du programme.

    GNU cflow est capable de produire des graphiques de stream directs et inversés pour les sources C. Une liste de références croisées peut éventuellement être générée. Deux formats de sortie sont implémentés: POSIX et GNU (étendu).

    Les fichiers d’entrée peuvent éventuellement être prétraités avant l’parsing.

    modifier
    Quant à la demande de la bibliothèque. Vous voudrez peut-être “modifier” output.c et, au lieu d’imprimer, faire autre chose avec les données. Le stream interne est organisé en gestionnaires de sortie, je pense donc qu’écrire avec votre propre gestionnaire pourrait déjà faire l’affaire. Ce n’est pas hors de la boîte cependant.

    Transformer mon commentaire en réponse.

    Vous pouvez consulter la sortie de l’assemblage et la traiter à l’aide d’un script. En supposant que gcc sur linux, vous passez l’indicateur -S à gcc et traitez le résultat avec quelque chose comme ceci:

     perl -ne '/^([^. \t#].*):/ and $f=$1;/call\s+([^*]\S*)/ and print "$f -> $1\n";' *.S 

    Cela vous donnera une ligne pour chaque appel statique, contenant l’appel et la fonction appelée. Vous pouvez append un peu de passe-partout autour de cela et donner le résultat, ou ce que vous voulez en faire.

    Vous pouvez omettre la partie de l’expression régulière «ne doit pas commencer par une écanvas» pour obtenir également une indication des appels indirects. Vous ne pourrez toujours pas dire quelles fonctions seront appelées à ce moment-là, mais au moins, vous saurez qu’il y a quelque chose de plus à savoir.