From: Ted Kremenek Date: Wed, 18 Mar 2009 22:10:22 +0000 (+0000) Subject: Fix crash reported in . We now have X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ec099f1f9d1384cec624944744a9fe92df4b389b;p=clang Fix crash reported in . We now have SVal::GetRValueSymbolVal do the checking if we can symbolicate a type instead of having BasicStoreManager do it (which wasn't always doing the check consistently). Having this check in SVal::GetRValueSymbolVal keeps the check in one centralized place. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67245 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/BasicStore.cpp b/lib/Analysis/BasicStore.cpp index 8cfe7a9840..b883f88061 100644 --- a/lib/Analysis/BasicStore.cpp +++ b/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(VD) || - isa(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(VD) || + isa(VD)) + ? SVal::GetRValueSymbolVal(StateMgr.getSymbolManager(), R) + : UndefinedVal(); + + St = BindInternal(St, Loc::MakeVal(R), X); } } return St; diff --git a/lib/Analysis/SVals.cpp b/lib/Analysis/SVals.cpp index cca0e94191..3762ae5ce6 100644 --- a/lib/Analysis/SVals.cpp +++ b/lib/Analysis/SVals.cpp @@ -324,11 +324,18 @@ NonLoc NonLoc::MakeCompoundVal(QualType T, llvm::ImmutableList Vals, SVal SVal::GetRValueSymbolVal(SymbolManager& SymMgr, const MemRegion* R) { SymbolRef sym = SymMgr.getRegionRValueSymbol(R); - if (const TypedRegion* TR = dyn_cast(R)) - if (Loc::IsLocType(TR->getRValueType(SymMgr.getContext()))) + if (const TypedRegion* TR = dyn_cast(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, diff --git a/test/Analysis/misc-ps.m b/test/Analysis/misc-ps.m index 08de2f4aac..ae777a5e26 100644 --- a/test/Analysis/misc-ps.m +++ b/test/Analysis/misc-ps.m @@ -195,3 +195,9 @@ void pr3772(void) // PR 3780 - This tests that StmtIterator isn't broken for VLAs in DeclGroups. void pr3780(int sz) { typedef double MAT[sz][sz]; } +// - Test that we don't symbolicate doubles before +// we are ready to do something with them. +int rdar6695527(double x) { + if (!x) { return 0; } + return 1; +}