diff options
Diffstat (limited to 'clang/lib/StaticAnalyzer')
| -rw-r--r-- | clang/lib/StaticAnalyzer/Core/BugReporter.cpp | 26 | ||||
| -rw-r--r-- | clang/lib/StaticAnalyzer/Core/PathDiagnostic.cpp | 4 |
2 files changed, 20 insertions, 10 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/BugReporter.cpp b/clang/lib/StaticAnalyzer/Core/BugReporter.cpp index c898d65a5f9..c6689f8536d 100644 --- a/clang/lib/StaticAnalyzer/Core/BugReporter.cpp +++ b/clang/lib/StaticAnalyzer/Core/BugReporter.cpp @@ -193,7 +193,7 @@ static void removeRedundantMsgs(PathPieces &path) { /// that aren't needed. Return true if afterwards the path contains /// "interesting stuff" which means it should be pruned from the parent path. bool BugReporter::RemoveUneededCalls(PathPieces &pieces, BugReport *R, - PathDiagnosticCallPiece *CallWithLoc) { + PathDiagnosticLocation *LastCallLocation) { bool containsSomethingInteresting = false; const unsigned N = pieces.size(); @@ -217,18 +217,24 @@ bool BugReporter::RemoveUneededCalls(PathPieces &pieces, BugReport *R, containsSomethingInteresting = true; break; } + + if (LastCallLocation) { + if (!call->callEnter.asLocation().isValid()) + call->callEnter = *LastCallLocation; + if (!call->callReturn.asLocation().isValid()) + call->callReturn = *LastCallLocation; + } + // Recursively clean out the subclass. Keep this call around if // it contains any informative diagnostics. - PathDiagnosticCallPiece *NewCallWithLoc = - call->getLocation().asLocation().isValid() - ? call : CallWithLoc; - - if (!RemoveUneededCalls(call->path, R, NewCallWithLoc)) - continue; + if (call->callEnterWithin.asLocation().isValid()) + LastCallLocation = &call->callEnterWithin; + else + LastCallLocation = &call->callEnter; - if (NewCallWithLoc == CallWithLoc && CallWithLoc) { - call->callEnter = CallWithLoc->callEnter; - } + assert(LastCallLocation && "Outermost call has an invalid location"); + if (!RemoveUneededCalls(call->path, R, LastCallLocation)) + continue; containsSomethingInteresting = true; break; diff --git a/clang/lib/StaticAnalyzer/Core/PathDiagnostic.cpp b/clang/lib/StaticAnalyzer/Core/PathDiagnostic.cpp index 0f48d1e1c79..2ebadcaa238 100644 --- a/clang/lib/StaticAnalyzer/Core/PathDiagnostic.cpp +++ b/clang/lib/StaticAnalyzer/Core/PathDiagnostic.cpp @@ -790,11 +790,14 @@ PathDiagnosticCallPiece::getCallEnterEvent() const { StringRef msg = Out.str(); if (msg.empty()) return 0; + assert(callEnter.asLocation().isValid()); return new PathDiagnosticEventPiece(callEnter, msg); } IntrusiveRefCntPtr<PathDiagnosticEventPiece> PathDiagnosticCallPiece::getCallEnterWithinCallerEvent() const { + if (!callEnterWithin.asLocation().isValid()) + return 0; SmallString<256> buf; llvm::raw_svector_ostream Out(buf); if (const NamedDecl *ND = dyn_cast_or_null<NamedDecl>(Caller)) @@ -819,6 +822,7 @@ PathDiagnosticCallPiece::getCallExitEvent() const { Out << "Returning from '" << *ND << "'"; else Out << "Returning to caller"; + assert(callReturn.asLocation().isValid()); return new PathDiagnosticEventPiece(callReturn, Out.str()); } |

