diff options
Diffstat (limited to 'clang/lib/Analysis')
| -rw-r--r-- | clang/lib/Analysis/GRExprEngine.cpp | 60 |
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); + } } } |

