summaryrefslogtreecommitdiffstats
path: root/clang/lib/StaticAnalyzer/Core/ExplodedGraph.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2013-02-25 07:37:13 +0000
committerTed Kremenek <kremenek@apple.com>2013-02-25 07:37:13 +0000
commit04fa9e3d80a9bfff23e373af329f3c655bc4ee29 (patch)
tree0a0d78db49fc102af35dbffadd2aa53104e8f410 /clang/lib/StaticAnalyzer/Core/ExplodedGraph.cpp
parent87869db5f5394fc35f38de1ebbe85f21d5549d99 (diff)
downloadbcm5719-llvm-04fa9e3d80a9bfff23e373af329f3c655bc4ee29.tar.gz
bcm5719-llvm-04fa9e3d80a9bfff23e373af329f3c655bc4ee29.zip
[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. llvm-svn: 176010
Diffstat (limited to 'clang/lib/StaticAnalyzer/Core/ExplodedGraph.cpp')
-rw-r--r--clang/lib/StaticAnalyzer/Core/ExplodedGraph.cpp18
1 files changed, 15 insertions, 3 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/ExplodedGraph.cpp b/clang/lib/StaticAnalyzer/Core/ExplodedGraph.cpp
index 443d87076a3..02268c410ab 100644
--- a/clang/lib/StaticAnalyzer/Core/ExplodedGraph.cpp
+++ b/clang/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.
OpenPOWER on IntegriCloud