2010-11-29 35 views
2

J'utilise clang pour faire une sorte de transformation source-source. Je voudrais faire ce qui suit:Analyse d'appel de fonction en utilisant Clang

J'ai une classe de fonctions dans C qui sont va_arg fonctions, par exemple printf(). Il peut y avoir un certain nombre d'appels à printf() dans le fichier source. Je veux analyser le code source et trouver tous ces appels à printf(). En outre, je veux trouver le type d'arguments qui sont passés à printf(). Donc, si j'ai quelque chose comme

int a, b, c; 
printf("%d%d%d", a, b, c); 

Je veux être en mesure de comprendre que l'appel particulier à printf est de type printf(char*, int, int, int). Je ne me soucie pas particulièrement des qualificatifs.

Quelqu'un pourrait-il me dire comment je devrais faire cela en clang? Tout exemple faisant quelque chose de similaire serait le bienvenu. Si vous pouviez même me dire ce que toutes les classes que je devrais regarder et en bref me dire le flux que je devrais suivre, je serais très reconnaissant.

Répondre

0

Vous devez écrire un ASTConsumer. La première chose à regarder est le code examples/PrintFunctionNames qui est un ASTConsumer très simple.

Une façon de trouver tous les appels à printf est à travers le RecursiveASTVisitor, à la recherche des noeuds CallExpr. Ces nœuds ont getNumArgs() et getArg (n) qui vous permet d'examiner les arguments. Vous pouvez appeler expr-> getType() sur ces expressions pour obtenir leurs types.