代码之家  ›  专栏  ›  技术社区  ›  Varun Hegde

如何获取clang中调用者参数的源变量声明?

  •  0
  • Varun Hegde  · 技术社区  · 5 年前

    我对Clang很陌生。所以,如果这个问题听起来很愚蠢,请原谅我。

    我正在写一个简单的Clang-Checker。

    我有一个简单的程序。

    void function(int a)
    {
       printf("%d", a);
    }
    
    main()
    {      
           static int A = 0; 
           //some computation
           //How to get the source of the variable declaration of A here? 
           func(A);    
    }
    

    我的尝试

    void MyChecker::checkPreCall(const CallEvent &Call,
                                           CheckerContext &C) const {
    
       ParamVarDecl *VD = Call.parameters()[0];
       //this dumps the declaration of the callee function, i.e dest
       Call.parameters()[0]->dump();
       if(Call.parameters()[0]->isStaticLocal()){
            std::cout << "Static variable";
        }
    
    }
    

    我试图在调用func时获取的的变量声明。但是,它得到被调用参数的变量声明;即dest。如何获取源的变量声明?

    0 回复  |  直到 5 年前
        1
  •  1
  •   Valeriy Savchenko    5 年前

    参数 是函数声明的一部分,而 论据 是调用表达式的一部分。你可以在这里面读到更多关于它的信息 question 。叮当声 documentation 也强调了这一区别 parameters 方法:

    返回调用的形参。

    请记住,形式参数的数量可能与所有调用的参数数量不匹配。但是,第一个参数将始终与getargsval(0)返回的参数值相对应。

    你需要使用 getArgExpr 相反。另外,我要注意的是,任何表达式都可以用作调用参数,因此为了获得变量声明,首先需要检查参数表达式是否确实引用了命名声明(即 DeclRefExpr ,然后转到实际声明。

    我希望这些信息有帮助。快乐的黑客与叮当声!