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

时间:2019-04-18 23:31:23

标签: clang abstract-syntax-tree

我刚接触clang。因此,如果这个问题听起来很愚蠢,请原谅。

我正在尝试编写一个简单的Clang检查器。

我有一个简单的程序。

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时获得A的变量声明。但是,它获取被调用方参数的变量声明;即目标如何获取源代码的变量声明?

1 个答案:

答案 0 :(得分:1)

参数是函数声明的一部分,而 arguments 是调用表达式的一部分。您可以在此question中详细了解它。 Clang的documentation也强调了parameters方法的这一区别:

  

返回呼叫的形式参数。

     

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

您需要改用getArgExpr。另外,我想指出,任何表达式都可以用作调用参数,因此,为了获取变量声明,您首先需要检查参数表达式的确是在引用命名声明(即DeclRefExpr),然后再执行到实际的声明。

我希望这些信息对您有所帮助。使用Clang进行快乐的黑客入侵!