diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-11-11 19:41:42 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-11-11 19:41:42 +0000 |
commit | e219b8a9c02198b1938dfa9ed91ef9cf0e6ce4f3 (patch) | |
tree | df8ed83c048e78fe8243897efa69b73cb1786a19 /lib/Analysis/UninitializedValues.cpp | |
parent | e97d9db35c5a4589718ba76e6caa14cd6919f789 (diff) |
Flow-sensitive uninitialized values analysis:
- Added support for ObjCForCollectionStmt
- Fixed bug where expression values would be always set to uninitialized when loops were involved
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59076 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/UninitializedValues.cpp')
-rw-r--r-- | lib/Analysis/UninitializedValues.cpp | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/lib/Analysis/UninitializedValues.cpp b/lib/Analysis/UninitializedValues.cpp index 60489023b2..3a84b2861a 100644 --- a/lib/Analysis/UninitializedValues.cpp +++ b/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; } |