diff options
-rw-r--r-- | clang/lib/Analysis/CFRefCount.cpp | 29 | ||||
-rw-r--r-- | clang/lib/Analysis/GRExprEngine.cpp | 4 | ||||
-rw-r--r-- | clang/lib/Analysis/GRSimpleVals.cpp | 8 |
3 files changed, 29 insertions, 12 deletions
diff --git a/clang/lib/Analysis/CFRefCount.cpp b/clang/lib/Analysis/CFRefCount.cpp index e720096aaf7..23613d13205 100644 --- a/clang/lib/Analysis/CFRefCount.cpp +++ b/clang/lib/Analysis/CFRefCount.cpp @@ -1518,13 +1518,20 @@ void CFRefCount::EvalSummary(ExplodedNodeSet<GRState>& Dst, // Set the value of the variable to be a conjured symbol. unsigned Count = Builder.getCurrentBlockCount(); QualType T = R->getType(); - SymbolID NewSym = - Eng.getSymbolManager().getConjuredSymbol(*I, T, Count); - state = state.SetSVal(*MR, - Loc::IsLocType(T) - ? cast<SVal>(loc::SymbolVal(NewSym)) - : cast<SVal>(nonloc::SymbolVal(NewSym))); + // FIXME: handle structs. + if (T->isIntegerType() || Loc::IsLocType(T)) { + SymbolID NewSym = + Eng.getSymbolManager().getConjuredSymbol(*I, T, Count); + + state = state.SetSVal(*MR, + Loc::IsLocType(T) + ? cast<SVal>(loc::SymbolVal(NewSym)) + : cast<SVal>(nonloc::SymbolVal(NewSym))); + } + else { + state = state.SetSVal(*MR, UnknownVal()); + } } else state = state.SetSVal(*MR, UnknownVal()); @@ -1566,13 +1573,18 @@ void CFRefCount::EvalSummary(ExplodedNodeSet<GRState>& Dst, default: assert (false && "Unhandled RetEffect."); break; - case RetEffect::NoRet: + case RetEffect::NoRet: { // Make up a symbol for the return value (not reference counted). // FIXME: This is basically copy-and-paste from GRSimpleVals. We // should compose behavior, not copy it. - if (Ex->getType() != Eng.getContext().VoidTy) { + // FIXME: We eventually should handle structs and other compound types + // that are returned by value. + + QualType T = Ex->getType(); + + if (T->isIntegerType() || Loc::IsLocType(T)) { unsigned Count = Builder.getCurrentBlockCount(); SymbolID Sym = Eng.getSymbolManager().getConjuredSymbol(Ex, Count); @@ -1584,6 +1596,7 @@ void CFRefCount::EvalSummary(ExplodedNodeSet<GRState>& Dst, } break; + } case RetEffect::Alias: { unsigned idx = RE.getIndex(); diff --git a/clang/lib/Analysis/GRExprEngine.cpp b/clang/lib/Analysis/GRExprEngine.cpp index bdf42e99c53..98e8427a69a 100644 --- a/clang/lib/Analysis/GRExprEngine.cpp +++ b/clang/lib/Analysis/GRExprEngine.cpp @@ -2038,8 +2038,10 @@ void GRExprEngine::VisitBinaryOperator(BinaryOperator* B, case BinaryOperator::Assign: { // EXPERIMENTAL: "Conjured" symbols. + // FIXME: Handle structs. + QualType T = RHS->getType(); - if (RightV.isUnknown()) { + if (RightV.isUnknown() && (T->isIntegerType() || Loc::IsLocType(T))) { unsigned Count = Builder->getCurrentBlockCount(); SymbolID Sym = SymMgr.getConjuredSymbol(B->getRHS(), Count); diff --git a/clang/lib/Analysis/GRSimpleVals.cpp b/clang/lib/Analysis/GRSimpleVals.cpp index 2b1d9b59fa6..d0055e56651 100644 --- a/clang/lib/Analysis/GRSimpleVals.cpp +++ b/clang/lib/Analysis/GRSimpleVals.cpp @@ -379,9 +379,11 @@ void GRSimpleVals::EvalCall(ExplodedNodeSet<GRState>& Dst, } - // Make up a symbol for the return value of this function. - - if (CE->getType() != Eng.getContext().VoidTy) { + // Make up a symbol for the return value of this function. + // FIXME: We eventually should handle structs and other compound types + // that are returned by value. + QualType T = CE->getType(); + if (T->isIntegerType() || Loc::IsLocType(T)) { unsigned Count = Builder.getCurrentBlockCount(); SymbolID Sym = Eng.getSymbolManager().getConjuredSymbol(CE, Count); |