Есть ли способ получить вызывающую функцию CallExpr * в методе VisitCallExpr clang?

Метод getDirectCallee() может получить вызываемого (вызываемого метода /функции) выражения вызова, но есть ли способ получить вызывающий объект (метод /функция, вызвавший его) из CallExpr* в VisitCallExpr() метод?

Есть ли другие способы узнать, кто вызвал одно выражение вызова?

7 голосов | спросил Lotay 29 SunEurope/Moscow2013-12-29T16:46:18+04:00Europe/Moscow12bEurope/MoscowSun, 29 Dec 2013 16:46:18 +0400 2013, 16:46:18

2 ответа


0

Лучший способ справиться с этим - использовать AST matchers. вы можете в основном искать все узлы callExpr в сопоставителе AST и связывать их, а также связывать соответствующие узлы вызывающего (CXXRecordDecl) с другой строкой.

Например:

CallBackFunc callBackFunc;

Matchers.addMatcher(callExpr(isExpansionInMainFile(), callee(), hasAncestor(recordDecl().bind("caller"))).bind("callee"), &callBackFunc);

Затем в функции callBack вы можете получить следующие функции вызываемого и вызывающего абонентов:

class CallBackFunc : public MatchFinder::MatchCallBack {
  public:
     virtual void run(const MatcherFinder::MatchResult &Results) {
        auto callee = Results.Nodes.getNodeAs<clang::CallExpr>("callee");
        auto caller = Results.Nodes.getNodeAs<clang::CXXRecordDecl>("caller"); 

       // Do what is required with callee and caller.
    }
};

(я могу дать больше информации, если потребуется)

ответил G Gill 7 +03002015-10-07T01:30:15+03:00312015bEurope/MoscowWed, 07 Oct 2015 01:30:15 +0300 2015, 01:30:15
0

Мой ответ может быть не идеальным, но он работает.

Прямого метода, предоставляющего прямой вызов выражения вызова, не существует. Но если мы посмотрим на путь AST при входе в функцию вызываемого абонента, если мы каким-то образом сохраним последнее посещенное имя FunctionDecl, это даст вам прямой абонент этого CallExpr*.

Пример

string CallerFunc = ""; //declared in class (private/public)    
virtual bool VisitFunctionDecl(FunctionDecl *func)
{
    CallerFunc = func->getNameInfo().getName().getAsString();
    return true;
}
virtual bool VisitCallExpr(CallExpr *E)
{
    if (E != NULL){
        QualType q = E->getType();
        const Type *t = q.getTypePtrOrNull();

        if(t != NULL)
        {
            FunctionDecl *func = E->getDirectCallee(); //gives you callee function
            string callee = func->getNameInfo().getName().getAsString();
            cout << callee << " is called by " << CallerFunc;
        }
    }
}
ответил Saumya Suhagiya 31 AM00000080000001631 2015, 08:40:16

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132