1

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

1 に答える 1