Здравствуйте, я внедрил посетителя AST, который работает неплохо, и он может печатать на консоли информацию, которую я хочу получить от AST, такую как объявления переменных, декларации функций и вызовы функций , Сегодня, когда я экспериментировал, я столкнулся с вызовом функции, который не распознается как вызов функции. Синтаксика такая же, как вызов функции. Вот код:Атрибут вызова функции посетителя АСТ не правильно распознает вызов функции
void
TIFFError(const char* module, const char* fmt, ...)
{
va_list ap;
va_start(ap, fmt); <------------------------------ THIS IS THE FUNCTION CALL
if (_TIFFerrorHandler)
(*_TIFFerrorHandler)(module, fmt, ap);
if (_TIFFerrorHandlerExt)
(*_TIFFerrorHandlerExt)(0, module, fmt, ap);
va_end(ap); <--------------------------------AND THIS ONE
}
Мой код ASTvisitor это:
bool VisitStmt(Stmt *st)
{
FullSourceLoc FullLocation = astContext->getFullLoc(st->getLocStart());
FileID fileID = FullLocation.getFileID();
unsigned int thisFileID = fileID.getHashValue();
if(thisFileID == 1) //checks if the node is in the main = input file.
{
if (CallExpr *call = dyn_cast<CallExpr>(st))
{
numFuncCalls++;
//call->dump(); //prints the corresponding line of the AST.
FunctionDecl *func_decl;
if(call->getDirectCallee())
{
func_decl = call ->getDirectCallee();
string funcCall = func_decl->getNameInfo().getName().getAsString();
cout << "Function call: " << funcCall << " with arguments ";
APIs << funcCall << ",";
for(int i=0, j = call->getNumArgs(); i<j; i++)
{
//For each argument it prints its type. The function must be declared otherwise it will return int-for unknown argument type.
APIs << call->getArg(i)->getType().getAsString()<< ",";
cout << call->getArg(i)->getType().getAsString() << ", ";
}
cout << "\n";
}
else
{
Expr *expr = call->getCallee();
string exprCall = expr->getStmtClassName();
cout << "Expression call: " << exprCall << " with arguments ";
APIs << exprCall << ",";
for(int i=0, j = call->getNumArgs(); i<j; i++)
{
//For each argument it prints its type. The function must be declared otherwise it will return int-for unknown argument type.
APIs << call->getArg(i)->getType().getAsString()<< ",";
cout << call->getArg(i)->getType().getAsString() << ", ";
}
cout << "\n";
}
}
}
return true;
}
Выражение, если (по призванию> getDirectCallee()) не верно для этих вызовов.
Как извлечь «имя функции» и его аргументы, как я делаю с «нормальными» вызовами функций? Или даже кто-нибудь дает мне представление о том, почему эти вызовы не распознаются рекурсивным посетителем АСТ, как обычные вызовы функций.
спасибо.
Благодарим вас за ответ. Это прояснит ситуацию и заставит меня двигаться дальше. Я сбрасываю соответствующую строку, и я вижу __builtin_va_start (ap, param), но до этого я никогда не сталкивался с чем-то вроде этого (определяя макрос для вызова функции). В вашем последнем пункте я уже реализовал VisitVarDecl и VisitFuctionDecl. VisitStmt поможет мне получить вызовы функций. Если есть лучший способ получить их, пожалуйста, дайте мне знать. –
Вы можете вызывать такие функции, как visitCallExpr, visitCXXMemberCallExpr для регулярной функции и вызова функции-члена. Там может быть больше, но я не знаю об этом. Кроме того, если ваш исходный вопрос будет разрешен, я буду признателен, если вы отметите его. –
Спасибо за ваш комментарий. Я не знал, что visitCallExpr существует !! Я не сталкивался с этой функцией в doxygen. Я использовал этот источник http://clang.llvm.org/doxygen/classclang_1_1idx_1_1ASTVisitor.html Вы правы. VisitCallExpr() также существует .. –