Maison > développement back-end > C++ > 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
Libérer: 2024-11-16 10:59:03
original
929 Les gens l'ont consulté

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 -
    Copier après la connexion
  2. Analysez l'assembly à l'aide de l'opt outil avec l'indicateur -analyze :

    opt -analyze main.ll
    Copier après la connexion
  3. Générer un fichier DOT représentant le graphe d'appel :

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

    dot -Tpng -o callgraph.png callgraph.dot
    Copier après la connexion

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();
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal