如何使用clang在另一个语句之前检测语句

时间:2014-02-19 17:36:26

标签: clang llvm instrumentation

我必须通过在它之前添加一个语句来处理clang中的某些语句。我有一个指向Expr对象的指针,我需要在包含它的语句之前插入另一个语句。现在我正在使用一个hacky方法,它只是移回SourceLocation指针直到我看到一个;或}或{。但这并不适用于所有情况。例如,当我尝试检测for语句时,它失败了。 clang中是否有任何类提供了一种更清洁的方法?

编辑:这是我的代码片段。我需要在包含指针解除引用的语句之前插入一个断言。

bool MyRecursiveASTVisitor::VisitUnaryOperator(UnaryOperator *E){
    if (E->getOpcode() == UO_Deref ){
        Expr *e1 = E->getSubExpr();
        SourceLocation SL = E->getLocStart();
    }
    return true;
}

1 个答案:

答案 0 :(得分:3)

您可以在返回getSourceRange()的语句中使用SourceRange。SourceRange类具有getBegin(),它将返回SourceLocation

你可以结帐https://github.com/eschulte/clang-mutate并在那里看一个例子......

修改

为了从Stmt中提取Expr,您可以查看此SO问题How to get Stmt class object from Expr object in Clang