2008-10-31 5 views
1

J'ai besoin de trouver toutes les occurrences d'un appel de fonction dans un fichier C++ en utilisant python, et d'extraire les arguments pour chaque appel.
Je joue avec le paquet pygccxml et extraire les arguments d'une chaîne avec l'appel de fonction est extrêmement simple:Recherche d'invocations d'une certaine fonction dans un fichier C++ en utilisant python

from pygccxml.declarations import call_invocation 

def test_is_call_invocation(call): 
    if call_invocation.is_call_invocation(call): 
     print call_invocation.name(call) 
     for arg in call_invocation.args(call): 
      print " ",arg 
    else: 
     print "not a function invocation" 

Ce que je ne pouvais pas trouver est un moyen d'obtenir les appels d'analyse syntaxique d'un fichier:

from pygccxml import parser 
from pygccxml import declarations 

decls = parser.parse(['main.cpp']) 
# ... 

est-il un moyen de trouver les appels à une fonction en utilisant le package pygccxml?
Ou peut-être que ce paquet est une exagération pour ce que j'essaie de faire :) et il y a un moyen beaucoup plus simple? Trouver les appels de fonction avec une expression régulière est, je le crains, beaucoup plus compliqué que ce que l'on pourrait penser à première vue ...

Répondre

2

XML-GCC ne peut pas le faire, car il ne signale que les types de données (et signatures de fonction). Il ignore les corps de la fonction. Pour voir cela, créez a.cc:

void foo() 
{} 

void bar() 
{ 
     foo(); 
} 

puis exécutez gccxml a.cc -fxml=a.xml. Regardez le fichier a.xml généré, pour voir que la seule mention de foo (ou de son id) est dans la déclaration de foo.

Une alternative pourrait être disponible dans codeviz (http://www.csn.ul.ie/~mel/projects/codeviz/). Il se compose d'un correctif pour gcc 3.4.6 qui génère des informations de dépendance d'appel - plus quelques scripts perl qui génèrent une entrée graphviz; ce dernier, vous pouvez ignorer en toute sécurité. Comme autre alternative (qui n'a pas besoin de modifications de gcc) vous pouvez copier l'approche de egypt (http://www.gson.org/egypt/); ceci analyse les dumps GCC RTL. Il devrait fonctionner avec n'importe quel GCC récent, cependant, il se peut que vous n'obteniez pas d'appels aux fonctions inline. En tout cas, avec ces approches, vous n'obtiendrez pas d '"appels" aux macros, mais cela pourrait être le meilleur choix.

Questions connexes