Hallo Ich habe einen AST-Besucher implementiert, der recht gut funktioniert und in der Konsole die Informationen aus dem AST drucken kann, wie Variablendeklarationen, Funktionsdeklarationen und Funktionsaufrufe . Heute, während ich experimentiert habe, bin ich auf einen Funktionsaufruf gestoßen, der nicht als Funktionsaufruf erkannt wird. Syntaktisch ist das gleiche wie ein Funktionsaufruf. Hier ist der Code:AST Besucherfunktion Anrufausdruck erkennt den Funktionsaufruf nicht korrekt
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
}
Mein Code des ASTVisitor ist dies:
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;
}
Der Ausdruck if (Call-> getDirectCallee()) ist nicht wahr, für die Anrufe.
Wie kann ich den "Funktionsnamen" und seine Argumente extrahieren, wie ich es mit den "normalen" Funktionsaufrufen mache? Oder sogar jemand gibt mir einen Einblick, warum diese Anrufe von AST rekursive Besucher nicht als normale Funktionsaufrufe erkannt werden.
Vielen Dank.
Vielen Dank für Ihre Antwort. Das wird die Dinge klären und mich weiterbringen. Ich dump die entsprechende Zeile und ich kann den __builtin_va_start (ap, param) sehen, aber ich bin nie zuvor über so etwas gekommen (Definieren eines Makros für einen Funktionsaufruf.). Zu Ihrem letzten Punkt habe ich VisitVarDecl und VisitFuctionDecl bereits implementiert. Der VisitStmt soll mir helfen, die Funktionsaufrufe zu bekommen. Wenn es einen besseren Weg gibt, sie zu bekommen, lass es mich wissen. –
Sie können Funktionen wie visitCallExpr, visitCXXMemberCallExpr für eine reguläre Funktion und einen Funktionsaufruf aufrufen. Es könnte mehr geben, aber ich bin mir dessen nicht bewusst. Auch, wenn Ihre ursprüngliche Frage gelöst ist, werde ich schätzen, wenn Sie es markieren. –
Vielen Dank für Ihren Kommentar. Ich wusste nicht, dass visitCallExpr existiert !! Ich bin im Doxygen auf diese Funktion nicht gestoßen. Ich benutzte diese Quelle http://clang.llvm.org/doxygen/classclang_1_1idx_1_1ASTVisitor.html Sie haben Recht. VisitCallExpr() existiert auch .. –