diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-07-03 05:26:14 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-07-03 05:26:14 +0000 |
commit | 1d3c797c903dc642d65703b112d2b703d402af6c (patch) | |
tree | acbfc88424b20e66ae2e3fe3e31926fa0abec01d | |
parent | 590afde872f26f902c3c6a0952c66884e46b2f7d (diff) | |
download | bcm5719-llvm-1d3c797c903dc642d65703b112d2b703d402af6c.tar.gz bcm5719-llvm-1d3c797c903dc642d65703b112d2b703d402af6c.zip |
Have BugReporter::getCFG and BugReporter::getLiveVariables returns pointers instead of references, because they can both fail
on functions we cannot construct full CFGs for yet.
llvm-svn: 53081
-rw-r--r-- | clang/Driver/AnalysisConsumer.cpp | 54 | ||||
-rw-r--r-- | clang/include/clang/Analysis/PathSensitive/BugReporter.h | 8 | ||||
-rw-r--r-- | clang/lib/Analysis/BugReporter.cpp | 2 | ||||
-rw-r--r-- | clang/lib/Analysis/DeadStores.cpp | 2 |
4 files changed, 40 insertions, 26 deletions
diff --git a/clang/Driver/AnalysisConsumer.cpp b/clang/Driver/AnalysisConsumer.cpp index c557b80c7ee..1dc2fac4f84 100644 --- a/clang/Driver/AnalysisConsumer.cpp +++ b/clang/Driver/AnalysisConsumer.cpp @@ -123,9 +123,9 @@ namespace { Decl* getCodeDecl() const { return D; } Stmt* getBody() const { return Body; } - virtual CFG& getCFG() { + virtual CFG* getCFG() { if (!cfg) cfg.reset(CFG::buildCFG(getBody())); - return *cfg.get(); + return cfg.get(); } virtual ParentMap& getParentMap() { @@ -157,14 +157,17 @@ namespace { return C.PD.get(); } - virtual LiveVariables& getLiveVariables() { + virtual LiveVariables* getLiveVariables() { if (!liveness) { - liveness.reset(new LiveVariables(getCFG())); - liveness->runOnCFG(getCFG()); - liveness->runOnAllBlocks(getCFG(), 0, true); + CFG* c = getCFG(); + if (!c) return 0; + + liveness.reset(new LiveVariables(*c)); + liveness->runOnCFG(*c); + liveness->runOnAllBlocks(*c, 0, true); } - return *liveness.get(); + return liveness.get(); } bool shouldVisualize() const { @@ -285,27 +288,32 @@ void AnalysisConsumer::HandleCode(Decl* D, Stmt* Body, Actions actions) { //===----------------------------------------------------------------------===// static void ActionDeadStores(AnalysisManager& mgr) { - BugReporter BR(mgr); - CheckDeadStores(mgr.getLiveVariables(), BR); + if (LiveVariables* L = mgr.getLiveVariables()) { + BugReporter BR(mgr); + CheckDeadStores(*L, BR); + } } static void ActionUninitVals(AnalysisManager& mgr) { - CheckUninitializedValues(mgr.getCFG(), mgr.getContext(), - mgr.getDiagnostic()); + if (CFG* c = mgr.getCFG()) + CheckUninitializedValues(*c, mgr.getContext(), mgr.getDiagnostic()); } static void ActionGRExprEngine(AnalysisManager& mgr, GRTransferFuncs* tf) { + llvm::OwningPtr<GRTransferFuncs> TF(tf); + + // Construct the analysis engine. + LiveVariables* L = mgr.getLiveVariables(); + if (!L) return; // Display progress. if (!mgr.shouldVisualize()) mgr.DisplayFunction(); - // Construct the analysis engine. - GRExprEngine Eng(mgr.getCFG(), *mgr.getCodeDecl(), mgr.getContext(), - mgr.getLiveVariables()); + GRExprEngine Eng(*mgr.getCFG(), *mgr.getCodeDecl(), mgr.getContext(), *L); Eng.setTransferFunctions(tf); // Execute the worklist algorithm. @@ -355,18 +363,24 @@ static void ActionSimpleChecks(AnalysisManager& mgr) { } static void ActionLiveness(AnalysisManager& mgr) { - mgr.DisplayFunction(); - mgr.getLiveVariables().dumpBlockLiveness(mgr.getSourceManager()); + if (LiveVariables* L = mgr.getLiveVariables()) { + mgr.DisplayFunction(); + L->dumpBlockLiveness(mgr.getSourceManager()); + } } static void ActionCFGDump(AnalysisManager& mgr) { - mgr.DisplayFunction(); - mgr.getCFG().dump(); + if (CFG* c = mgr.getCFG()) { + mgr.DisplayFunction(); + c->dump(); + } } static void ActionCFGView(AnalysisManager& mgr) { - mgr.DisplayFunction(); - mgr.getCFG().viewCFG(); + if (CFG* c = mgr.getCFG()) { + mgr.DisplayFunction(); + c->viewCFG(); + } } static void ActionCheckObjCDealloc(AnalysisManager& mgr) { diff --git a/clang/include/clang/Analysis/PathSensitive/BugReporter.h b/clang/include/clang/Analysis/PathSensitive/BugReporter.h index f608da0c2e5..d1c430fc961 100644 --- a/clang/include/clang/Analysis/PathSensitive/BugReporter.h +++ b/clang/include/clang/Analysis/PathSensitive/BugReporter.h @@ -136,9 +136,9 @@ public: virtual PathDiagnosticClient* getPathDiagnosticClient() = 0; virtual ASTContext& getContext() = 0; virtual SourceManager& getSourceManager() = 0; - virtual CFG& getCFG() = 0; + virtual CFG* getCFG() = 0; virtual ParentMap& getParentMap() = 0; - virtual LiveVariables& getLiveVariables() = 0; + virtual LiveVariables* getLiveVariables() = 0; }; class BugReporter { @@ -173,7 +173,7 @@ public: return D.getSourceManager(); } - CFG& getCFG() { + CFG* getCFG() { return D.getCFG(); } @@ -181,7 +181,7 @@ public: return D.getParentMap(); } - LiveVariables& getLiveVariables() { + LiveVariables* getLiveVariables() { return D.getLiveVariables(); } diff --git a/clang/lib/Analysis/BugReporter.cpp b/clang/lib/Analysis/BugReporter.cpp index 1741e7dc9b5..fba31f81af3 100644 --- a/clang/lib/Analysis/BugReporter.cpp +++ b/clang/lib/Analysis/BugReporter.cpp @@ -118,7 +118,7 @@ Stmt* BugReport::getStmt(BugReporter& BR) const { Stmt *S = NULL; if (BlockEntrance* BE = dyn_cast<BlockEntrance>(&ProgP)) - if (BE->getBlock() == &BR.getCFG().getExit()) + if (BE->getBlock() == &BR.getCFG()->getExit()) S = GetLastStmt(EndNode); if (!S) S = GetStmt(ProgP); diff --git a/clang/lib/Analysis/DeadStores.cpp b/clang/lib/Analysis/DeadStores.cpp index 02198b29066..ded0ed0d89f 100644 --- a/clang/lib/Analysis/DeadStores.cpp +++ b/clang/lib/Analysis/DeadStores.cpp @@ -153,7 +153,7 @@ void clang::CheckDeadStores(LiveVariables& L, BugReporter& BR) { DiagCollector C(BT); DeadStoreObs A(BR.getContext(), BR.getDiagnostic(), C, BR.getParentMap()); - L.runOnAllBlocks(BR.getCFG(), &A); + L.runOnAllBlocks(*BR.getCFG(), &A); // Emit the bug reports. |