Анализ вызова функции с использованием Clang - PullRequest
2 голосов
/ 29 ноября 2010

Я использую clang для преобразования источника в источник. Я хотел бы сделать следующее:

У меня есть некоторый класс функций в C, которые являются va_arg функциями, например, printf(). В исходном файле может быть несколько вызовов printf(). Я хочу разобрать исходный код и найти все эти вызовы на printf(). Кроме того, я хочу найти тип аргументов, которые передаются в printf(). Итак, если у меня есть что-то вроде

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

Я хочу выяснить, что конкретный вызов printf имеет тип printf(char*, int, int, int). Меня не особо волнуют квалификаторы.

Может кто-нибудь сказать мне, как я должен делать это в Clang? Любой пример, делающий что-то похожее на это, будет приветствоваться. Если бы вы даже могли сказать мне, на какие уроки я должен смотреть, и вкратце рассказать мне о том, чему я должен следовать, я был бы очень благодарен.

1 Ответ

0 голосов
/ 22 мая 2011

Вы должны написать ASTConsumer. Первое, на что нужно обратить внимание, это код в examples / PrintFunctionNames , который является очень простым ASTConsumer.

Один из способов найти все вызовы для printf - через RecursiveASTVisitor , ищущий CallExpr узлы. Эти узлы имеют getNumArgs () и getArg (n), которые позволяют вам исследовать аргументы. Вы можете вызвать expr-> getType () для этих выражений, чтобы получить их типы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...