summaryrefslogtreecommitdiffstats
path: root/clang/lib/StaticAnalyzer
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/StaticAnalyzer')
-rw-r--r--clang/lib/StaticAnalyzer/Core/BugReporter.cpp26
-rw-r--r--clang/lib/StaticAnalyzer/Core/PathDiagnostic.cpp4
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());
}
OpenPOWER on IntegriCloud