使用Clang AST打印函数的参数

Print arguments of a function using Clang AST

本文关键字:参数 函数 打印 Clang AST 使用      更新时间:2023-10-16

我想获得传递给函数的参数。例如,如果我有呼叫

printf("%d%d",i,j);

输出应该是

%d%d
i
j

我可以使用RecursiveASTVisitor中的VisitCallExpr()进行函数调用。还可以获取参数的数量和参数类型。但我不知道该如何得到论据。

bool MyRecursiveASTVisitor::VisitCallExpr (clang::CallExpr *E)  
{
    for(int i=0, j=E->getNumArgs(); i<j; i++)
    {
        llvm::errs() << "argType: " << E->getArg(i)->getType().getAsString() << "n";
    }
    return true;
}

输出:

argType:char*
argType:int
argType:int

请帮我把论据拿出来。

你的答案是非常有用的martins。我不知道printPretty(…)函数。现在,我可以打印论点了。下面是我打印参数的代码。

bool MyRecursiveASTVisitor::VisitCallExpr (clang::CallExpr *E)
{
    clang::LangOptions LangOpts;
    LangOpts.CPlusPlus = true;
    clang::PrintingPolicy Policy(LangOpts);
    for(int i=0, j=E->getNumArgs(); i<j; i++)
    {
        std::string TypeS;
        llvm::raw_string_ostream s(TypeS);
        E->getArg(i)->printPretty(s, 0, Policy);
        llvm::errs() << "arg: " << s.str() << "n";
    }
    return true;
}

输出如下:

"%d%d"
i
j

您正在调用E->getArg(i)->getType(),但这是参数类型。使用E->getArg(i)来获取表示参数值的Expr*。然后使用printPretty(…)方法将其漂亮地打印到字符串中,如果您需要字符串值的话。