diff options
Diffstat (limited to 'lib/StaticAnalyzer')
-rw-r--r-- | lib/StaticAnalyzer/Core/BugReporter.cpp | 8 | ||||
-rw-r--r-- | lib/StaticAnalyzer/Core/PathDiagnostic.cpp | 25 | ||||
-rw-r--r-- | lib/StaticAnalyzer/Core/PlistDiagnostics.cpp | 10 |
3 files changed, 38 insertions, 5 deletions
diff --git a/lib/StaticAnalyzer/Core/BugReporter.cpp b/lib/StaticAnalyzer/Core/BugReporter.cpp index 73e00e4416..53fedaf2a1 100644 --- a/lib/StaticAnalyzer/Core/BugReporter.cpp +++ b/lib/StaticAnalyzer/Core/BugReporter.cpp @@ -1233,10 +1233,18 @@ static void GenerateExtensivePathDiagnostic(PathDiagnostic& PD, // Pop the call hierarchy if we are done walking the contents // of a function call. if (const CallEnter *CE = dyn_cast<CallEnter>(&P)) { + // Add an edge to the start of the function. + const Decl *D = CE->getCalleeContext()->getDecl(); + PathDiagnosticLocation pos = + PathDiagnosticLocation::createBegin(D, SM); + EB.addEdge(pos); + + // Flush all locations, and pop the active path. EB.flushLocations(); PD.popActivePath(); assert(!PD.getActivePath().empty()); PDB.LC = N->getLocationContext(); + // The current active path should never be empty. Either we // just added a bunch of stuff to the top-level path, or // we have a previous CallExit. If the front of the active diff --git a/lib/StaticAnalyzer/Core/PathDiagnostic.cpp b/lib/StaticAnalyzer/Core/PathDiagnostic.cpp index a082bba70d..01b40b43ba 100644 --- a/lib/StaticAnalyzer/Core/PathDiagnostic.cpp +++ b/lib/StaticAnalyzer/Core/PathDiagnostic.cpp @@ -527,7 +527,8 @@ void PathDiagnosticCallPiece::setCallee(const CallEnter &CE, const Decl *D = CE.getCalleeContext()->getDecl(); Callee = D; callEnter = PathDiagnosticLocation(CE.getCallExpr(), SM, - CE.getLocationContext()); + CE.getLocationContext()); + callEnterWithin = PathDiagnosticLocation::createBegin(D, SM); } IntrusiveRefCntPtr<PathDiagnosticEventPiece> @@ -537,16 +538,32 @@ PathDiagnosticCallPiece::getCallEnterEvent() const { SmallString<256> buf; llvm::raw_svector_ostream Out(buf); if (isa<BlockDecl>(Callee)) - Out << "Entering call to block"; + Out << "Calling anonymous block"; else if (const NamedDecl *ND = dyn_cast<NamedDecl>(Callee)) - Out << "Entering call to '" << *ND << "'"; + Out << "Calling '" << *ND << "'"; StringRef msg = Out.str(); if (msg.empty()) return 0; return new PathDiagnosticEventPiece(callEnter, msg); } -IntrusiveRefCntPtr<PathDiagnosticEventPiece> +IntrusiveRefCntPtr<PathDiagnosticEventPiece> +PathDiagnosticCallPiece::getCallEnterWithinCallerEvent() const { + if (!Callee) + return 0; + SmallString<256> buf; + llvm::raw_svector_ostream Out(buf); + if (isa<BlockDecl>(Callee)) + Out << "Entered call to block"; + else if (const NamedDecl *ND = dyn_cast<NamedDecl>(Callee)) + Out << "Entered call to '" << *ND << "'"; + StringRef msg = Out.str(); + if (msg.empty()) + return 0; + return new PathDiagnosticEventPiece(callEnterWithin, msg); +} + +IntrusiveRefCntPtr<PathDiagnosticEventPiece> PathDiagnosticCallPiece::getCallExitEvent() const { if (!Caller) return 0; diff --git a/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp b/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp index 6f2a5ca931..2c8270a2dd 100644 --- a/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp +++ b/lib/StaticAnalyzer/Core/PlistDiagnostics.cpp @@ -255,15 +255,23 @@ static void ReportCall(raw_ostream &o, IntrusiveRefCntPtr<PathDiagnosticEventPiece> callEnter = P.getCallEnterEvent(); + if (callEnter) ReportPiece(o, *callEnter, FM, SM, LangOpts, indent, true); + IntrusiveRefCntPtr<PathDiagnosticEventPiece> callEnterWithinCaller = + P.getCallEnterWithinCallerEvent(); + + if (callEnterWithinCaller) + ReportPiece(o, *callEnterWithinCaller, FM, SM, LangOpts, indent, true); + for (PathPieces::const_iterator I = P.path.begin(), E = P.path.end();I!=E;++I) ReportPiece(o, **I, FM, SM, LangOpts, indent, true); IntrusiveRefCntPtr<PathDiagnosticEventPiece> callExit = P.getCallExitEvent(); - if (callExit) + + if (callExit) ReportPiece(o, *callExit, FM, SM, LangOpts, indent, true); } |