aboutsummaryrefslogtreecommitdiff
path: root/Analysis/UninitializedValues.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Analysis/UninitializedValues.cpp')
-rw-r--r--Analysis/UninitializedValues.cpp68
1 files changed, 29 insertions, 39 deletions
diff --git a/Analysis/UninitializedValues.cpp b/Analysis/UninitializedValues.cpp
index c885b91046..7598a0e168 100644
--- a/Analysis/UninitializedValues.cpp
+++ b/Analysis/UninitializedValues.cpp
@@ -33,13 +33,8 @@ class RegisterDeclsExprs : public CFGRecStmtDeclVisitor<RegisterDeclsExprs> {
public:
RegisterDeclsExprs(UninitializedValues::AnalysisDataTy& ad) : AD(ad) {}
- void VisitBlockVarDecl(BlockVarDecl* VD) {
- if (!AD.isTracked(VD)) AD[VD] = AD.NumDecls++;
- }
-
- void BlockStmt_VisitExpr(Expr* E) {
- if (!AD.isTracked(E)) AD[E] = AD.NumBlockExprs++;
- }
+ void VisitBlockVarDecl(BlockVarDecl* VD) { AD.Register(VD); }
+ void BlockStmt_VisitExpr(Expr* E) { AD.Register(E); }
};
} // end anonymous namespace
@@ -77,19 +72,19 @@ public:
bool VisitDeclStmt(DeclStmt* D);
BlockVarDecl* FindBlockVarDecl(Stmt* S);
-
- static inline bool Initialized() { return true; }
- static inline bool Uninitialized() { return false; }
};
+
+static const bool Initialized = true;
+static const bool Uninitialized = false;
bool TransferFuncs::VisitDeclRefExpr(DeclRefExpr* DR) {
if (BlockVarDecl* VD = dyn_cast<BlockVarDecl>(DR->getDecl())) {
if (AD.Observer) AD.Observer->ObserveDeclRefExpr(V,AD,DR,VD);
- return V.getBitRef(VD,AD);
+ return V(VD,AD);
}
- else return Initialized();
+ else return Initialized;
}
BlockVarDecl* TransferFuncs::FindBlockVarDecl(Stmt *S) {
@@ -109,7 +104,7 @@ BlockVarDecl* TransferFuncs::FindBlockVarDecl(Stmt *S) {
bool TransferFuncs::VisitBinaryOperator(BinaryOperator* B) {
if (CFG::hasImplicitControlFlow(B))
- return V.getBitRef(B,AD);
+ return V(B,AD);
if (B->isAssignmentOp())
// Get the Decl for the LHS (if any).
@@ -122,30 +117,33 @@ bool TransferFuncs::VisitBinaryOperator(BinaryOperator* B) {
// just adding extra messages that don't
// contribute to diagnosing the bug. In InitWithAssigns mode
// we unconditionally set the assigned variable to Initialized to
- // prevent Uninitialized propogation.
- return V.getBitRef(VD,AD) = Initialized();
+ // prevent Uninitialized propagation.
+ return V(VD,AD) = Initialized;
}
- else return V.getBitRef(VD,AD) = Visit(B->getRHS());
+ else return V(VD,AD) = Visit(B->getRHS());
return VisitStmt(B);
}
bool TransferFuncs::VisitDeclStmt(DeclStmt* S) {
- bool x = Initialized();
+ bool x = Initialized;
for (ScopedDecl* D = S->getDecl(); D != NULL; D = D->getNextDeclarator())
- if (BlockVarDecl* VD = dyn_cast<BlockVarDecl>(D))
- if (Stmt* I = VD->getInit()) {
- x = V.getBitRef(cast<Expr>(I),AD);
- V.getBitRef(VD,AD) = x;
- }
+ if (BlockVarDecl* VD = dyn_cast<BlockVarDecl>(D)) {
+ if (Stmt* I = VD->getInit())
+ x = InitWithAssigns ? Initialized : V(cast<Expr>(I),AD);
+ else
+ x = Uninitialized;
+
+ V(VD,AD) = x;
+ }
return x;
}
bool TransferFuncs::VisitCallExpr(CallExpr* C) {
VisitChildren(C);
- return Initialized();
+ return Initialized;
}
bool TransferFuncs::VisitUnaryOperator(UnaryOperator* U) {
@@ -153,7 +151,7 @@ bool TransferFuncs::VisitUnaryOperator(UnaryOperator* U) {
case UnaryOperator::AddrOf:
// For "&x", treat "x" as now being initialized.
if (BlockVarDecl* VD = FindBlockVarDecl(U->getSubExpr()))
- V.getBitRef(VD,AD) = Initialized();
+ V(VD,AD) = Initialized;
else
return Visit(U->getSubExpr());
@@ -163,20 +161,20 @@ bool TransferFuncs::VisitUnaryOperator(UnaryOperator* U) {
}
bool TransferFuncs::VisitStmt(Stmt* S) {
- bool x = Initialized();
+ bool x = Initialized;
// We don't stop at the first subexpression that is Uninitialized because
// evaluating some subexpressions may result in propogating "Uninitialized"
// or "Initialized" to variables referenced in the other subexpressions.
for (Stmt::child_iterator I=S->child_begin(), E=S->child_end(); I!=E; ++I)
- if (Visit(*I) == Uninitialized()) x = Uninitialized();
+ if (Visit(*I) == Uninitialized) x = Uninitialized;
return x;
}
bool TransferFuncs::BlockStmt_VisitExpr(Expr* E) {
assert (AD.isTracked(E));
- return V.getBitRef(E,AD) = Visit(E);
+ return V(E,AD) = Visit(E);
}
} // end anonymous namespace
@@ -196,15 +194,9 @@ bool TransferFuncs::BlockStmt_VisitExpr(Expr* E) {
//===----------------------------------------------------------------------===//
namespace {
-struct Merge {
- void operator()(UninitializedValues::ValTy& Dst,
- UninitializedValues::ValTy& Src) {
- assert (Src.sizesEqual(Dst) && "BV sizes do not match.");
- Dst.DeclBV |= Src.DeclBV;
- Dst.ExprBV |= Src.ExprBV;
- }
-};
-} // end anonymous namespace
+ typedef ExprDeclBitVector_Types::Union Merge;
+ typedef DataflowSolver<UninitializedValues,TransferFuncs,Merge> Solver;
+}
//===----------------------------------------------------------------------===//
// Unitialized values checker. Scan an AST and flag variable uses
@@ -228,7 +220,7 @@ public:
assert ( AD.isTracked(VD) && "Unknown VarDecl.");
- if (V.getBitRef(VD,AD) == TransferFuncs::Uninitialized())
+ if (V(VD,AD) == Uninitialized)
if (AlreadyWarned.insert(VD))
Diags.Report(DR->getSourceRange().Begin(), diag::warn_uninit_val);
}
@@ -237,8 +229,6 @@ public:
namespace clang {
void CheckUninitializedValues(CFG& cfg, ASTContext &Ctx, Diagnostic &Diags) {
-
- typedef DataflowSolver<UninitializedValues,TransferFuncs,Merge> Solver;
// Compute the unitialized values information.
UninitializedValues U;