diff options
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Analysis/BasicStore.cpp | 22 | ||||
-rw-r--r-- | clang/lib/Analysis/SVals.cpp | 13 |
2 files changed, 19 insertions, 16 deletions
diff --git a/clang/lib/Analysis/BasicStore.cpp b/clang/lib/Analysis/BasicStore.cpp index 8cfe7a98401..b883f880614 100644 --- a/clang/lib/Analysis/BasicStore.cpp +++ b/clang/lib/Analysis/BasicStore.cpp @@ -526,19 +526,15 @@ Store BasicStoreManager::getInitialStore() { if (VD->getStorageClass() == VarDecl::Static) continue; - // Only handle pointers and integers for now. - QualType T = VD->getType(); - if (Loc::IsLocType(T) || T->isIntegerType()) { - // Initialize globals and parameters to symbolic values. - // Initialize local variables to undefined. - const MemRegion *R = StateMgr.getRegion(VD); - SVal X = (VD->hasGlobalStorage() || isa<ParmVarDecl>(VD) || - isa<ImplicitParamDecl>(VD)) - ? SVal::GetRValueSymbolVal(StateMgr.getSymbolManager(), R) - : UndefinedVal(); - - St = BindInternal(St, Loc::MakeVal(R), X); - } + // Initialize globals and parameters to symbolic values. + // Initialize local variables to undefined. + const MemRegion *R = StateMgr.getRegion(VD); + SVal X = (VD->hasGlobalStorage() || isa<ParmVarDecl>(VD) || + isa<ImplicitParamDecl>(VD)) + ? SVal::GetRValueSymbolVal(StateMgr.getSymbolManager(), R) + : UndefinedVal(); + + St = BindInternal(St, Loc::MakeVal(R), X); } } return St; diff --git a/clang/lib/Analysis/SVals.cpp b/clang/lib/Analysis/SVals.cpp index cca0e94191d..3762ae5ce61 100644 --- a/clang/lib/Analysis/SVals.cpp +++ b/clang/lib/Analysis/SVals.cpp @@ -324,11 +324,18 @@ NonLoc NonLoc::MakeCompoundVal(QualType T, llvm::ImmutableList<SVal> Vals, SVal SVal::GetRValueSymbolVal(SymbolManager& SymMgr, const MemRegion* R) { SymbolRef sym = SymMgr.getRegionRValueSymbol(R); - if (const TypedRegion* TR = dyn_cast<TypedRegion>(R)) - if (Loc::IsLocType(TR->getRValueType(SymMgr.getContext()))) + if (const TypedRegion* TR = dyn_cast<TypedRegion>(R)) { + QualType T = TR->getRValueType(SymMgr.getContext()); + + if (Loc::IsLocType(T)) return Loc::MakeVal(sym); - return NonLoc::MakeVal(sym); + // Only handle integers for now. + if (T->isIntegerType()) + return NonLoc::MakeVal(sym); + } + + return UnknownVal(); } nonloc::LocAsInteger nonloc::LocAsInteger::Make(BasicValueFactory& Vals, Loc V, |