summaryrefslogtreecommitdiffstats
path: root/clang/lib/Analysis
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2009-02-14 01:54:57 +0000
committerTed Kremenek <kremenek@apple.com>2009-02-14 01:54:57 +0000
commit13363538ca07ad7e0e408764089fa194ec0c7fb5 (patch)
tree155d6d506e846e15d70f64a22979f8799e08b742 /clang/lib/Analysis
parent538c3d845986a43014574d6a21a030281c266fdb (diff)
downloadbcm5719-llvm-13363538ca07ad7e0e408764089fa194ec0c7fb5.tar.gz
bcm5719-llvm-13363538ca07ad7e0e408764089fa194ec0c7fb5.zip
Use GRTransferFuncs::EvalBind when processing variable initializations.
llvm-svn: 64527
Diffstat (limited to 'clang/lib/Analysis')
-rw-r--r--clang/lib/Analysis/GRExprEngine.cpp60
1 files changed, 34 insertions, 26 deletions
diff --git a/clang/lib/Analysis/GRExprEngine.cpp b/clang/lib/Analysis/GRExprEngine.cpp
index f0e93de2193..9b02af44e1e 100644
--- a/clang/lib/Analysis/GRExprEngine.cpp
+++ b/clang/lib/Analysis/GRExprEngine.cpp
@@ -1794,28 +1794,6 @@ void GRExprEngine::VisitDeclStmt(DeclStmt* DS, NodeTy* Pred, NodeSet& Dst) {
const GRState* state = GetState(*I);
unsigned Count = Builder->getCurrentBlockCount();
- // Decls without InitExpr are not initialized explicitly.
- if (InitEx) {
- SVal InitVal = GetSVal(state, InitEx);
- QualType T = VD->getType();
-
- // Recover some path-sensitivity if a scalar value evaluated to
- // UnknownVal.
- if (InitVal.isUnknown()) {
- if (Loc::IsLocType(T)) {
- SymbolRef Sym = SymMgr.getConjuredSymbol(InitEx, Count);
- InitVal = loc::SymbolVal(Sym);
- }
- else if (T->isIntegerType() && T->isScalarType()) {
- SymbolRef Sym = SymMgr.getConjuredSymbol(InitEx, Count);
- InitVal = nonloc::SymbolVal(Sym);
- }
- }
-
- state = StateMgr.BindDecl(state, VD, InitVal);
- } else
- state = StateMgr.BindDeclWithNoInit(state, VD);
-
// Check if 'VD' is a VLA and if so check if has a non-zero size.
QualType T = getContext().getCanonicalType(VD->getType());
if (VariableArrayType* VLA = dyn_cast<VariableArrayType>(T)) {
@@ -1831,10 +1809,10 @@ void GRExprEngine::VisitDeclStmt(DeclStmt* DS, NodeTy* Pred, NodeSet& Dst) {
}
continue;
}
-
+
bool isFeasibleZero = false;
const GRState* ZeroSt = Assume(state, Size, false, isFeasibleZero);
-
+
bool isFeasibleNotZero = false;
state = Assume(state, Size, true, isFeasibleNotZero);
@@ -1849,8 +1827,38 @@ void GRExprEngine::VisitDeclStmt(DeclStmt* DS, NodeTy* Pred, NodeSet& Dst) {
if (!isFeasibleNotZero)
continue;
}
-
- MakeNode(Dst, DS, *I, state);
+
+ // Decls without InitExpr are not initialized explicitly.
+ if (InitEx) {
+ SVal InitVal = GetSVal(state, InitEx);
+ QualType T = VD->getType();
+
+ // Recover some path-sensitivity if a scalar value evaluated to
+ // UnknownVal.
+ if (InitVal.isUnknown()) {
+ if (Loc::IsLocType(T)) {
+ SymbolRef Sym = SymMgr.getConjuredSymbol(InitEx, Count);
+ InitVal = loc::SymbolVal(Sym);
+ }
+ else if (T->isIntegerType() && T->isScalarType()) {
+ SymbolRef Sym = SymMgr.getConjuredSymbol(InitEx, Count);
+ InitVal = nonloc::SymbolVal(Sym);
+ }
+ }
+
+ state = StateMgr.BindDecl(state, VD, InitVal);
+
+ // The next thing to do is check if the GRTransferFuncs object wants to
+ // update the state based on the new binding. If the GRTransferFunc
+ // object doesn't do anything, just auto-propagate the current state.
+ GRStmtNodeBuilderRef BuilderRef(Dst, *Builder, *this, *I, state, DS,true);
+ getTF().EvalBind(BuilderRef, loc::MemRegionVal(StateMgr.getRegion(VD)),
+ InitVal);
+ }
+ else {
+ state = StateMgr.BindDeclWithNoInit(state, VD);
+ MakeNode(Dst, DS, *I, state);
+ }
}
}
OpenPOWER on IntegriCloud