我正在编写一个用于在C代码中插入断言的clang插件。我已经实现了一个访问每个一元运算符的类,并检查它是否是一个指针解引用。如果是,我想为它插入一个NULL指针断言检查。但我陷入困境,因为我无法弄清楚如何在Clang中获取包含Expr对象的Stmt对象。
这是我的代码,用于检测断言,但是在完全错误的位置(即指针取消引用之后)。我想在包含取消引用的语句之前执行此操作。
bool MyRecursiveASTVisitor::VisitUnaryOperator(UnaryOperator *E){
if (E->getOpcode() == UO_Deref ){
Expr *e1 = E->getSubExpr();
SourceLocation SL = E->getLocEnd();
Rewrite.InsertText(SL, "assert(", true, true);
Rewrite.InsertText(SL, Rewrite.ConvertToString(e1), true, true);
Rewrite.InsertText(SL, " != NULL);", true, true);
}
return true;
}
答案 0 :(得分:2)
ASTContext::getParents
怎么样?
您还可以使用ParentMap
类构建部分父地图。