summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2008-11-11 19:41:42 +0000
committerTed Kremenek <kremenek@apple.com>2008-11-11 19:41:42 +0000
commit7a18858bcf52b3f98c4fdb7b82abc84b3efbb262 (patch)
treeea5f565659c0cf456370c54c048b1a056e7a449d
parent3b4e1d5cc62a2c29871cd2c7262143a3a5b30d04 (diff)
downloadbcm5719-llvm-7a18858bcf52b3f98c4fdb7b82abc84b3efbb262.tar.gz
bcm5719-llvm-7a18858bcf52b3f98c4fdb7b82abc84b3efbb262.zip
Flow-sensitive uninitialized values analysis:
- Added support for ObjCForCollectionStmt - Fixed bug where expression values would be always set to uninitialized when loops were involved llvm-svn: 59076
-rw-r--r--clang/lib/Analysis/UninitializedValues.cpp31
1 files changed, 27 insertions, 4 deletions
diff --git a/clang/lib/Analysis/UninitializedValues.cpp b/clang/lib/Analysis/UninitializedValues.cpp
index 60489023b26..3a84b2861ac 100644
--- a/clang/lib/Analysis/UninitializedValues.cpp
+++ b/clang/lib/Analysis/UninitializedValues.cpp
@@ -64,7 +64,8 @@ public:
CFG& getCFG() { return AD.getCFG(); }
void SetTopValue(UninitializedValues::ValTy& X) {
- X.resetValues(AD);
+ X.setDeclValues(AD);
+ X.resetExprValues(AD);
}
bool VisitDeclRefExpr(DeclRefExpr* DR);
@@ -74,6 +75,7 @@ public:
bool VisitCallExpr(CallExpr* C);
bool VisitDeclStmt(DeclStmt* D);
bool VisitConditionalOperator(ConditionalOperator* C);
+ bool VisitObjCForCollectionStmt(ObjCForCollectionStmt* S);
bool Visit(Stmt *S);
bool BlockStmt_VisitExpr(Expr* E);
@@ -81,8 +83,8 @@ public:
void VisitTerminator(CFGBlock* B) { }
};
-static const bool Initialized = true;
-static const bool Uninitialized = false;
+static const bool Initialized = false;
+static const bool Uninitialized = true;
bool TransferFuncs::VisitDeclRefExpr(DeclRefExpr* DR) {
@@ -178,6 +180,27 @@ bool TransferFuncs::VisitUnaryOperator(UnaryOperator* U) {
return Visit(U->getSubExpr());
}
+bool TransferFuncs::VisitObjCForCollectionStmt(ObjCForCollectionStmt* S) {
+ // This represents a use of the 'collection'
+ bool x = Visit(S->getCollection());
+
+ if (x == Uninitialized)
+ return Uninitialized;
+
+ // This represents an initialization of the 'element' value.
+ Stmt* Element = S->getElement();
+ VarDecl* VD = 0;
+
+ if (DeclStmt* DS = dyn_cast<DeclStmt>(Element))
+ VD = cast<VarDecl>(DS->getSolitaryDecl());
+ else
+ VD = cast<VarDecl>(cast<DeclRefExpr>(Element)->getDecl());
+
+ V(VD,AD) = Initialized;
+ return Initialized;
+}
+
+
bool TransferFuncs::VisitConditionalOperator(ConditionalOperator* C) {
Visit(C->getCond());
@@ -227,7 +250,7 @@ bool TransferFuncs::BlockStmt_VisitExpr(Expr* E) {
//===----------------------------------------------------------------------===//
namespace {
- typedef ExprDeclBitVector_Types::Intersect Merge;
+ typedef ExprDeclBitVector_Types::Union Merge;
typedef DataflowSolver<UninitializedValues,TransferFuncs,Merge> Solver;
}
OpenPOWER on IntegriCloud