diff options
author | Ted Kremenek <kremenek@apple.com> | 2013-02-25 07:37:13 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2013-02-25 07:37:13 +0000 |
commit | 4e9c0854382d37325771b50f6cf899a75119fa24 (patch) | |
tree | 7c4de1d7aab1c86070d3469db52ec4d3f112a162 | |
parent | d620e09c13b1ca32434ce440abf5bb0f3d0979c5 (diff) |
[analyzer] add the notion of an "interesting" lvalue expression for ExplodedNode pruning.
r175988 modified the ExplodedGraph trimming algorithm to retain all
nodes for "lvalue" expressions. This patch refines that notion to
only "interesting" expressions that would be used for diagnostics.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@176010 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h | 4 | ||||
-rw-r--r-- | lib/StaticAnalyzer/Core/BugReporterVisitors.cpp | 2 | ||||
-rw-r--r-- | lib/StaticAnalyzer/Core/ExplodedGraph.cpp | 18 |
3 files changed, 20 insertions, 4 deletions
diff --git a/include/clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h b/include/clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h index 82ac3d9ed0..70be1f8c63 100644 --- a/include/clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h +++ b/include/clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h @@ -387,6 +387,10 @@ public: /// was called. void reclaimRecentlyAllocatedNodes(); + /// \brief Returns true if nodes for the given expression kind are always + /// kept around. + static bool isInterestingLValueExpr(const Expr *Ex); + private: bool shouldCollect(const ExplodedNode *node); void collectNode(ExplodedNode *node); diff --git a/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp b/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp index cb716a3154..5e3daff9a4 100644 --- a/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp +++ b/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp @@ -663,7 +663,7 @@ bool bugreporter::trackNullOrUndefValue(const ExplodedNode *N, const Stmt *S, // or function call inside. Ex = Ex->IgnoreParenCasts(); - if (Ex->isLValue()) { + if (ExplodedGraph::isInterestingLValueExpr(Ex)) { const MemRegion *R = 0; // First check if this is a DeclRefExpr for a C++ reference type. diff --git a/lib/StaticAnalyzer/Core/ExplodedGraph.cpp b/lib/StaticAnalyzer/Core/ExplodedGraph.cpp index 443d87076a..02268c410a 100644 --- a/lib/StaticAnalyzer/Core/ExplodedGraph.cpp +++ b/lib/StaticAnalyzer/Core/ExplodedGraph.cpp @@ -56,6 +56,14 @@ ExplodedGraph::~ExplodedGraph() {} // Node reclamation. //===----------------------------------------------------------------------===// +bool ExplodedGraph::isInterestingLValueExpr(const Expr *Ex) { + if (!Ex->isLValue()) + return false; + return isa<DeclRefExpr>(Ex) || + isa<MemberExpr>(Ex) || + isa<ObjCIvarRefExpr>(Ex); +} + bool ExplodedGraph::shouldCollect(const ExplodedNode *node) { // Reclaim all nodes that match *all* the following criteria: // @@ -101,11 +109,15 @@ bool ExplodedGraph::shouldCollect(const ExplodedNode *node) { progPoint.getLocationContext() != pred->getLocationContext()) return false; + // All further checks require expressions. + const Expr *Ex = dyn_cast<Expr>(ps.getStmt()); + if (!Ex) + return false; + // Condition 8. - // Do not collect nodes for lvalue expressions since they are + // Do not collect nodes for "interesting" lvalue expressions since they are // used extensively for generating path diagnostics. - const Expr *Ex = dyn_cast<Expr>(ps.getStmt()); - if (!Ex || Ex->isLValue()) + if (isInterestingLValueExpr(Ex)) return false; // Condition 9. |