[analyzer] Use makeZeroVal in RegionStore's lazy evaluation of statics.

No functionality change.

llvm-svn: 175025
This commit is contained in:
Jordan Rose 2013-02-13 03:11:01 +00:00
parent bc67170056
commit ff0dd946b1
1 changed files with 19 additions and 23 deletions

View File

@ -1514,33 +1514,29 @@ SVal RegionStoreManager::getBindingForVar(RegionBindingsConstRef B,
return svalBuilder.getRegionValueSymbolVal(R); return svalBuilder.getRegionValueSymbolVal(R);
if (isa<GlobalsSpaceRegion>(MS)) { if (isa<GlobalsSpaceRegion>(MS)) {
if (isa<NonStaticGlobalSpaceRegion>(MS)) { // Function-scoped static variables are default-initialized to 0; if they
// Is 'VD' declared constant? If so, retrieve the constant value. // have an initializer, it would have been processed by now.
QualType CT = Ctx.getCanonicalType(T); if (isa<StaticGlobalSpaceRegion>(MS))
if (CT.isConstQualified()) { return svalBuilder.makeZeroVal(T);
const Expr *Init = VD->getInit();
// Do the null check first, as we want to call 'IgnoreParenCasts'. // Other globals
if (Init) // Is 'VD' declared constant? If so, retrieve the constant value.
if (const IntegerLiteral *IL = QualType CT = Ctx.getCanonicalType(T);
dyn_cast<IntegerLiteral>(Init->IgnoreParenCasts())) { if (CT.isConstQualified()) {
const nonloc::ConcreteInt &V = svalBuilder.makeIntVal(IL); if (const Expr *Init = VD->getInit()) {
return svalBuilder.evalCast(V, Init->getType(), IL->getType()); if (const IntegerLiteral *IL =
} dyn_cast<IntegerLiteral>(Init->IgnoreParenCasts())) {
const nonloc::ConcreteInt &V = svalBuilder.makeIntVal(IL);
return svalBuilder.evalCast(V, Init->getType(), IL->getType());
}
} }
if (const Optional<SVal> &V
= getBindingForDerivedDefaultValue(B, MS, R, CT))
return V.getValue();
return svalBuilder.getRegionValueSymbolVal(R);
} }
if (T->isIntegerType()) if (const Optional<SVal> &V
return svalBuilder.makeIntVal(0, T); = getBindingForDerivedDefaultValue(B, MS, R, CT))
if (T->isPointerType()) return V.getValue();
return svalBuilder.makeNull();
return UnknownVal(); return svalBuilder.getRegionValueSymbolVal(R);
} }
return UndefinedVal(); return UndefinedVal();