Maison  >  Article  >  développement back-end  >  Comment générer un graphique d'appel pour le code C à l'aide de LLVM ?

Comment générer un graphique d'appel pour le code C à l'aide de LLVM ?

DDD
DDDoriginal
2024-11-16 10:59:03855parcourir

How to Generate a Call Graph for C   Code Using LLVM?

Génération d'un graphique d'appel pour le code C

Pour découvrir les chemins d'exécution potentiels pour une fonction spécifique, en particulier lorsque l'identification manuelle n'est pas pratique, il est utile pour générer un graphe d'appels.

Création d'un graphe d'appels à l'aide de LLVM :

Pour construire un graphe d'appels à l'aide de LLVM (Low-Level Virtual Machine), suivez ces étapes :

  1. Compilez le code C avec l'option -emit-llvm pour générer l'assembly LLVM :

    clang++ -S -emit-llvm main.cpp -o -
  2. Analysez l'assembly à l'aide de l'opt outil avec l'indicateur -analyze :

    opt -analyze main.ll
  3. Générer un fichier DOT représentant le graphe d'appel :

    opt -analyze -dot-callgraph main.ll
  4. Convertir le fichier DOT à un format d'image à l'aide de Graphviz :

    dot -Tpng -o callgraph.png callgraph.dot

Ce processus produira une représentation visuelle du graphe d'appel, montrant tous les chemins menant à la fonction cible.

Exemple :

Considérons le code C suivant :

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();
}

En utilisant les étapes décrites ci-dessus, nous pouvons générer un graphe d'appel qui révèle tous les chemins possibles par lesquels D() peut être appelé.

Considérations supplémentaires :

  • Pour les bases de code complexes avec de nombreux chemins d'appel, il peut être nécessaire de post-traiter le fichier DOT à l'aide d'outils tels que c filt pour obtenir des noms de fonctions lisibles par l'homme.
  • Par défaut, opt supposera la présence d'une fonction externe, qui peut être filtrée ou renommée pour plus de clarté.
  • Assurez-vous que la fonction cible n'est pas conçu pour capturer avec précision la hiérarchie des appels.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn