2010-11-29 3 views
2

Я использую clang, чтобы сделать какой-то источник преобразования источника. Я хотел бы сделать следующее:Анализ функциональных вызовов с использованием 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? Любой пример, делающий что-либо подобное этому, приветствуется. Если бы вы могли даже сказать мне, на что все классы я должен смотреть, и вкратце рассказать мне поток, за которым я должен следовать, я был бы очень благодарен.

ответ

0

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

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