diff options
| -rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/IdempotentOperationChecker.cpp | 13 | 
1 files changed, 9 insertions, 4 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/IdempotentOperationChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/IdempotentOperationChecker.cpp index 46f06a0a848..5c257e595be 100644 --- a/clang/lib/StaticAnalyzer/Checkers/IdempotentOperationChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/IdempotentOperationChecker.cpp @@ -96,10 +96,9 @@ private:    // Hash table and related data structures    struct BinaryOperatorData { -    BinaryOperatorData() : assumption(Possible), analysisContext(0) {} +    BinaryOperatorData() : assumption(Possible) {}      Assumption assumption; -    AnalysisContext *analysisContext;      ExplodedNodeSet explodedNodes; // Set of ExplodedNodes that refer to a                                     // BinaryOperator    }; @@ -118,7 +117,6 @@ void IdempotentOperationChecker::checkPreStmt(const BinaryOperator *B,    BinaryOperatorData &Data = hash[B];    Assumption &A = Data.assumption;    AnalysisContext *AC = C.getCurrentAnalysisContext(); -  Data.analysisContext = AC;    // If we already have visited this node on a path that does not contain an    // idempotent operation, return immediately. @@ -351,9 +349,14 @@ void IdempotentOperationChecker::checkEndAnalysis(ExplodedGraph &G,      // Unpack the hash contents      const BinaryOperatorData &Data = i->second;      const Assumption &A = Data.assumption; -    AnalysisContext *AC = Data.analysisContext;      const ExplodedNodeSet &ES = Data.explodedNodes; +    // If there are no nodes accosted with the expression, nothing to report. +    // FIXME: This is possible because the checker does part of processing in +    // checkPreStmt and part in checkPostStmt. +    if (ES.begin() == ES.end()) +      continue; +      const BinaryOperator *B = i->first;      if (A == Impossible) @@ -363,6 +366,8 @@ void IdempotentOperationChecker::checkEndAnalysis(ExplodedGraph &G,      // warning      if (Eng.hasWorkRemaining()) {        // If we can trace back +      AnalysisContext *AC = (*ES.begin())->getLocationContext() +                                         ->getAnalysisContext();        if (!pathWasCompletelyAnalyzed(AC,                                       AC->getCFGStmtMap()->getBlock(B),                                       Eng.getCoreEngine()))  | 

