【问题标题】:How to get the source Variable Declaration of an caller argument in Clang?如何在 Clang 中获取调用者参数的源变量声明?
【发布时间】:2023-03-15 18:50:01
【问题描述】:

我对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 的变量声明。然而,它得到了被调用者参数的变量声明;即目的地。如何获取源的变量声明?

【问题讨论】:

    标签: clang abstract-syntax-tree


    【解决方案1】:

    Parameters 是函数声明的一部分,而 arguments 是调用表达式的一部分。您可以在此question 中了解更多信息。 Clang 的documentation 也强调了parameters 方法的这种差异:

    返回调用的形参。

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

    您需要改用getArgExpr。另外我要注意,任何表达式都可以用作调用参数,所以为了得到变量声明,你首先需要检查参数表达式是否确实引用了一个命名声明(即DeclRefExpr),然后转到实际声明。

    我希望这些信息对您有所帮助。愉快地使用 Clang 进行黑客攻击!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-25
      • 1970-01-01
      • 2020-04-18
      • 2016-10-21
      • 1970-01-01
      • 2020-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多