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;
}