From: Ted Kremenek Date: Wed, 22 May 2013 19:10:41 +0000 (+0000) Subject: [analyzer; alternate edges] remove redundant adjacent "events" with the same text. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1d85a9e8fb4e6ac513467b5fa825bd53e6fcba56;p=clang [analyzer; alternate edges] remove redundant adjacent "events" with the same text. Fixes git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@182505 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/StaticAnalyzer/Core/BugReporter.cpp b/lib/StaticAnalyzer/Core/BugReporter.cpp index 9663492a14..f08e048bb8 100644 --- a/lib/StaticAnalyzer/Core/BugReporter.cpp +++ b/lib/StaticAnalyzer/Core/BugReporter.cpp @@ -2026,6 +2026,31 @@ static void removePunyEdges(PathPieces &path, } } +static void removeIdenticalEvents(PathPieces &path) { + for (PathPieces::iterator I = path.begin(), E = path.end(); I != E; ++I) { + PathDiagnosticEventPiece *PieceI = + dyn_cast(*I); + + if (!PieceI) + continue; + + PathPieces::iterator NextI = I; ++NextI; + if (NextI == E) + return; + + PathDiagnosticEventPiece *PieceNextI = + dyn_cast(*I); + + if (!PieceNextI) + continue; + + // Erase the second piece if it has the same exact message text. + if (PieceI->getString() == PieceNextI->getString()) { + path.erase(NextI); + } + } +} + static bool optimizeEdges(PathPieces &path, SourceManager &SM, OptimizedCallsSet &OCS, LocationContextMap &LCM) { @@ -2199,6 +2224,8 @@ static bool optimizeEdges(PathPieces &path, SourceManager &SM, if (!hasChanges) { // Remove any puny edges left over after primary optimization pass. removePunyEdges(path, SM, PM); + // Remove identical events. + removeIdenticalEvents(path); } return hasChanges;