我刚接触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的变量声明。但是,它获取被调用方参数的变量声明;即目标如何获取源代码的变量声明?
答案 0 :(得分:1)
参数是函数声明的一部分,而 arguments 是调用表达式的一部分。您可以在此question中详细了解它。 Clang的documentation也强调了parameters
方法的这一区别:
返回呼叫的形式参数。
请记住,形式参数的数量可能与所有调用的参数数量都不匹配。但是,第一个参数将始终与getArgSVal(0)返回的参数值相对应。
您需要改用getArgExpr。另外,我想指出,任何表达式都可以用作调用参数,因此,为了获取变量声明,您首先需要检查参数表达式的确是在引用命名声明(即DeclRefExpr
),然后再执行到实际的声明。
我希望这些信息对您有所帮助。使用Clang进行快乐的黑客入侵!