diff --git a/clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp --- a/clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp @@ -213,8 +213,9 @@ // Returns the exploded node against which the report was emitted. // The caller *must* add any further transitions against this node. - ExplodedNode *reportBug(const MemRegion *Region, const CXXRecordDecl *RD, - CheckerContext &C, MisuseKind MK) const; + // Returns nullptr and does not report if such node already exists. + ExplodedNode *tryToReportBug(const MemRegion *Region, const CXXRecordDecl *RD, + CheckerContext &C, MisuseKind MK) const; bool isInMoveSafeContext(const LocationContext *LC) const; bool isStateResetMethod(const CXXMethodDecl *MethodDec) const; @@ -377,19 +378,20 @@ return; } - ExplodedNode *N = reportBug(Region, RD, C, MK); + ExplodedNode *N = tryToReportBug(Region, RD, C, MK); // If the program has already crashed on this path, don't bother. - if (N->isSink()) + if (!N || N->isSink()) return; State = State->set(Region, RegionState::getReported()); C.addTransition(State, N); } -ExplodedNode *MoveChecker::reportBug(const MemRegion *Region, - const CXXRecordDecl *RD, CheckerContext &C, - MisuseKind MK) const { +ExplodedNode *MoveChecker::tryToReportBug(const MemRegion *Region, + const CXXRecordDecl *RD, + CheckerContext &C, + MisuseKind MK) const { if (ExplodedNode *N = misuseCausesCrash(MK) ? C.generateErrorNode() : C.generateNonFatalErrorNode()) { // Uniqueing report to the same object.