2

私はclangを使用して、ある種のソースからソースへの変換を行っています。私は次のことをしたいと思います:

va_arg私は関数であるCのいくつかのクラスの関数を持っていますprintf(). printf()ソース ファイル内に多数の呼び出しがある場合があります。ソース コードを解析して、これらすべての呼び出しを見つけたいと考えていますprintf()。さらに、 に渡される引数の型を調べたいと思いますprintf()。だから、もし私が次のようなものを持っているなら

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

printfへの特定の呼び出しがタイプであることを把握できるようにしたいprintf(char*, int, int, int)。予選は特に気にしません。

誰かがこれをclangで行う方法を教えてもらえますか? これに似たようなことをする例は大歓迎です。私が見るべきすべてのクラスと、私が従うべき流れを簡単に教えていただければ、とても感謝しています.

4

1 に答える 1

0

ASTConsumer を記述する必要があります。最初に確認するのは、非常に単純な ASTConsumer であるexamples/PrintFunctionNamesのコードです。

printf へのすべての呼び出しを見つける 1 つの方法は、RecursiveASTVisitorを使用してCallExprノードを探すことです。これらのノードには、引数を調べることができる getNumArgs() と getArg(n) があります。これらの式で expr->getType() を呼び出して、それらの型を取得できます。

于 2011-05-22T09:34:02.940 に答える