diff --git a/clang/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp --- a/clang/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp @@ -30,8 +30,9 @@ : public Checker< check::Location, check::Bind, EventDispatcher > { - mutable std::unique_ptr BT_null; - mutable std::unique_ptr BT_undef; + BugType BT_Null{this, "Dereference of null pointer", categories::MemoryError}; + BugType BT_Undef{this, "Dereference of undefined pointer value", + categories::MemoryError}; void reportBug(ProgramStateRef State, const Stmt *S, CheckerContext &C) const; @@ -123,11 +124,6 @@ if (!N) return; - // We know that 'location' cannot be non-null. This is what - // we call an "explicit" null dereference. - if (!BT_null) - BT_null.reset(new BuiltinBug(this, "Dereference of null pointer")); - SmallString<100> buf; llvm::raw_svector_ostream os(buf); @@ -180,7 +176,7 @@ } auto report = std::make_unique( - *BT_null, buf.empty() ? BT_null->getDescription() : StringRef(buf), N); + BT_Null, buf.empty() ? BT_Null.getDescription() : StringRef(buf), N); bugreporter::trackExpressionValue(N, bugreporter::getDerefExpr(S), *report); @@ -196,12 +192,8 @@ // Check for dereference of an undefined value. if (l.isUndef()) { if (ExplodedNode *N = C.generateErrorNode()) { - if (!BT_undef) - BT_undef.reset( - new BuiltinBug(this, "Dereference of undefined pointer value")); - auto report = std::make_unique( - *BT_undef, BT_undef->getDescription(), N); + BT_Undef, BT_Undef.getDescription(), N); bugreporter::trackExpressionValue(N, bugreporter::getDerefExpr(S), *report); C.emitReport(std::move(report)); } @@ -220,6 +212,8 @@ std::tie(notNullState, nullState) = state->assume(location); // The explicit NULL case. + // We know that 'location' cannot be non-null. This is what + // we call an "explicit" null dereference. if (nullState) { if (!notNullState) { const Expr *expr = getDereferenceExpr(S);