Génération d'un graphe d'appel pour le code C afin de visualiser les chemins d'exécution
Pour générer un graphe d'appel pour le code C, nous visons à découvrir tout le potentiel chemins d’exécution qui mènent à une fonction cible spécifique. Cela peut être bénéfique pour éliminer l'identification manuelle de chaque chemin, en particulier lorsqu'il existe plusieurs chemins.
Dans l'exemple fourni, la fonction cible est D. Pour y parvenir, nous pouvons utiliser les étapes suivantes :
static void D() {} static void Y() { D(); } static void X() { Y(); } static void C() { D(); X(); } static void B() { C(); } static void S() { D(); } static void P() { S(); } static void O() { P(); } static void N() { O(); } static void M() { N(); } static void G() { M(); } static void A() { B(); G(); } int main() { A(); }
Une fois que nous avons notre code, nous pouvons générer le graphique d'appel à l'aide des commandes suivantes :
$ clang++ -S -emit-llvm main1.cpp -o - | opt -analyze -dot-callgraph $ dot -Tpng -ocallgraph.png callgraph.dot
Cela produira une représentation visuelle de l'appel graphique.
Cependant, pour obtenir les noms de fonctions réels plutôt que leurs homologues mutilés, nous pouvons post-traiter le graphique à l'aide de c filt :
#include <vector> struct A { A(int); void f(); // not defined, prevents inlining it! }; int main() { std::vector<A> v; v.push_back(42); v[0].f(); } $ clang++ -S -emit-llvm main1.cpp -o - | opt -analyze -std-link-opts -dot-callgraph $ cat callgraph.dot | c++filt | sed 's,>,\>,g; s,-\>,->,g; s,<,\<,g' | gawk '/external node/{id=} != id' | dot -Tpng -ocallgraph.png
Cela donnera un graphique d'appel plus informatif, montrant les noms réels des fonctions et des classes impliquées.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!