diff options
author | Anna Zaks <ganna@apple.com> | 2011-09-14 00:25:17 +0000 |
---|---|---|
committer | Anna Zaks <ganna@apple.com> | 2011-09-14 00:25:17 +0000 |
commit | 43f48b0b1bc763dc56db6e01de4fcc44ad389bef (patch) | |
tree | 5262a9d9542ecbb526353c8a3995f32104de3e5e /lib/StaticAnalyzer/Core/PathDiagnostic.cpp | |
parent | edc9592b2d100f841ae0ba69f07a5eaaccb08900 (diff) |
[analyzer] Refactor: Make PathDiagnosticLocation responsible for creating a valid object given an ExploadedNode (the same logic can be reused by other checkers).
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@139672 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/StaticAnalyzer/Core/PathDiagnostic.cpp')
-rw-r--r-- | lib/StaticAnalyzer/Core/PathDiagnostic.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/lib/StaticAnalyzer/Core/PathDiagnostic.cpp b/lib/StaticAnalyzer/Core/PathDiagnostic.cpp index e56f1572e9..28a6d403f5 100644 --- a/lib/StaticAnalyzer/Core/PathDiagnostic.cpp +++ b/lib/StaticAnalyzer/Core/PathDiagnostic.cpp @@ -12,6 +12,7 @@ //===----------------------------------------------------------------------===// #include "clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h" +#include "clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h" #include "clang/AST/Expr.h" #include "clang/AST/Decl.h" #include "clang/AST/DeclObjC.h" @@ -128,6 +129,30 @@ void PathDiagnosticClient::HandlePathDiagnostic(const PathDiagnostic *D) { // PathDiagnosticLocation methods. //===----------------------------------------------------------------------===// +PathDiagnosticLocation PathDiagnosticLocation::create(const ExplodedNode* N, + const SourceManager &SM) { + assert(N && "Cannot create a location with a null node."); + + const ExplodedNode *NI = N; + + while (NI) { + ProgramPoint P = NI->getLocation(); + + if (const StmtPoint *PS = dyn_cast<StmtPoint>(&P)) { + return PathDiagnosticLocation(PS->getStmt(), SM); + } + else if (const BlockEdge *BE = dyn_cast<BlockEdge>(&P)) { + const Stmt *Term = BE->getSrc()->getTerminator(); + assert(Term); + return PathDiagnosticLocation(Term, SM); + } + NI = NI->succ_empty() ? 0 : *(NI->succ_begin()); + } + + const Decl &D = N->getCodeDecl(); + return PathDiagnosticLocation(D.getBodyRBrace(), SM); +} + FullSourceLoc PathDiagnosticLocation::asLocation() const { assert(isValid()); // Note that we want a 'switch' here so that the compiler can warn us in |