From: Anna Zaks Date: Wed, 14 Mar 2012 18:58:28 +0000 (+0000) Subject: [analyzer] Diagnostics: Supply Caller information even if the bug occurs X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9373937945e1e075dfa08169eaccc1ad0b31f699;p=clang [analyzer] Diagnostics: Supply Caller information even if the bug occurs in the callee. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@152734 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h b/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h index e98d82bf22..1599924e4a 100644 --- a/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h +++ b/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h @@ -391,11 +391,17 @@ class PathDiagnosticCallPiece : public PathDiagnosticPiece { : PathDiagnosticPiece(Call), Caller(callerD), Callee(0), callReturn(callReturnPos) {} - PathDiagnosticCallPiece(PathPieces &oldPath) - : PathDiagnosticPiece(Call), Caller(0), Callee(0), path(oldPath) {} + PathDiagnosticCallPiece(PathPieces &oldPath, const Decl *caller) + : PathDiagnosticPiece(Call), Caller(caller), Callee(0), + NoExit(true), path(oldPath) {} const Decl *Caller; const Decl *Callee; + + // Flag signifying that this diagnostic has only call enter and no matching + // call exit. + bool NoExit; + public: PathDiagnosticLocation callEnter; PathDiagnosticLocation callEnterWithin; @@ -429,7 +435,8 @@ public: const CallExit &CE, const SourceManager &SM); - static PathDiagnosticCallPiece *construct(PathPieces &pieces); + static PathDiagnosticCallPiece *construct(PathPieces &pieces, + const Decl *caller); virtual void Profile(llvm::FoldingSetNodeID &ID) const; diff --git a/lib/StaticAnalyzer/Core/BugReporter.cpp b/lib/StaticAnalyzer/Core/BugReporter.cpp index 4ada636e8e..995ef264eb 100644 --- a/lib/StaticAnalyzer/Core/BugReporter.cpp +++ b/lib/StaticAnalyzer/Core/BugReporter.cpp @@ -418,8 +418,10 @@ static void GenerateMinimalPathDiagnostic(PathDiagnostic& PD, assert(!PD.getActivePath().empty()); PathDiagnosticCallPiece *C = dyn_cast(PD.getActivePath().front()); - if (!C) - C = PathDiagnosticCallPiece::construct(PD.getActivePath()); + if (!C) { + const Decl *Caller = CE->getLocationContext()->getDecl(); + C = PathDiagnosticCallPiece::construct(PD.getActivePath(), Caller); + } C->setCallee(*CE, SMgr); continue; } @@ -1064,8 +1066,10 @@ static void GenerateExtensivePathDiagnostic(PathDiagnostic& PD, // a new PathDiagnosticCallPiece. PathDiagnosticCallPiece *C = dyn_cast(PD.getActivePath().front()); - if (!C) - C = PathDiagnosticCallPiece::construct(PD.getActivePath()); + if (!C) { + const Decl * Caller = CE->getLocationContext()->getDecl(); + C = PathDiagnosticCallPiece::construct(PD.getActivePath(), Caller); + } C->setCallee(*CE, SM); EB.addContext(CE->getCallExpr()); break; diff --git a/lib/StaticAnalyzer/Core/PathDiagnostic.cpp b/lib/StaticAnalyzer/Core/PathDiagnostic.cpp index d09bb3280b..ef815be0db 100644 --- a/lib/StaticAnalyzer/Core/PathDiagnostic.cpp +++ b/lib/StaticAnalyzer/Core/PathDiagnostic.cpp @@ -515,8 +515,9 @@ PathDiagnosticCallPiece::construct(const ExplodedNode *N, } PathDiagnosticCallPiece * -PathDiagnosticCallPiece::construct(PathPieces &path) { - PathDiagnosticCallPiece *C = new PathDiagnosticCallPiece(path); +PathDiagnosticCallPiece::construct(PathPieces &path, + const Decl *caller) { + PathDiagnosticCallPiece *C = new PathDiagnosticCallPiece(path, caller); path.clear(); path.push_front(C); return C; @@ -563,7 +564,7 @@ PathDiagnosticCallPiece::getCallEnterWithinCallerEvent() const { IntrusiveRefCntPtr PathDiagnosticCallPiece::getCallExitEvent() const { - if (!Caller) + if (NoExit) return 0; SmallString<256> buf; llvm::raw_svector_ostream Out(buf); diff --git a/test/Analysis/inline-plist.c b/test/Analysis/inline-plist.c index 15b2070f23..852e93dff6 100644 --- a/test/Analysis/inline-plist.c +++ b/test/Analysis/inline-plist.c @@ -281,7 +281,7 @@ void test_has_bug() { // CHECK: // CHECK: depth1 // CHECK: extended_message -// CHECK: Entered call +// CHECK: Entered call from 'test_has_bug' // CHECK: message // CHECK: Entered call // CHECK: