diff options
author | Ted Kremenek <kremenek@apple.com> | 2009-09-11 22:07:28 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2009-09-11 22:07:28 +0000 |
commit | 5b9bd2137ebef350af803c634e3fdf5d74678100 (patch) | |
tree | 79f03bfa995cb56ab650f024970265964c46c820 /lib/Analysis/ValueManager.cpp | |
parent | 5346278f81930e7fd0545bbbb2fc217c6921b109 (diff) |
Introduce "DefinedOrUnknownSVal" into the SVal class hierarchy, providing a way
to statically type various methods in SValuator/GRState as required either a
defined value or a defined-but-possibly-unknown value. This leads to various
logic cleanups in GRExprEngine, and lets the compiler enforce via type checking
our assumptions about what symbolic values are possibly undefined and what are
not.
Along the way, clean up some of the static analyzer diagnostics regarding the uses of uninitialized values.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@81579 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/ValueManager.cpp')
-rw-r--r-- | lib/Analysis/ValueManager.cpp | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/lib/Analysis/ValueManager.cpp b/lib/Analysis/ValueManager.cpp index 9fe16af6c9..9c3dbdd24e 100644 --- a/lib/Analysis/ValueManager.cpp +++ b/lib/Analysis/ValueManager.cpp @@ -22,7 +22,7 @@ using namespace llvm; // Utility methods for constructing SVals. //===----------------------------------------------------------------------===// -SVal ValueManager::makeZeroVal(QualType T) { +DefinedOrUnknownSVal ValueManager::makeZeroVal(QualType T) { if (Loc::IsLocType(T)) return makeNull(); @@ -69,7 +69,8 @@ SVal ValueManager::convertToArrayIndex(SVal V) { return SVator->EvalCastNL(cast<NonLoc>(V), ArrayIndexTy); } -SVal ValueManager::getRegionValueSymbolVal(const MemRegion* R, QualType T) { +DefinedOrUnknownSVal ValueManager::getRegionValueSymbolVal(const MemRegion* R, + QualType T) { if (T.isNull()) { const TypedRegion* TR = cast<TypedRegion>(R); @@ -87,7 +88,7 @@ SVal ValueManager::getRegionValueSymbolVal(const MemRegion* R, QualType T) { return nonloc::SymbolVal(sym); } -SVal ValueManager::getConjuredSymbolVal(const Expr *E, unsigned Count) { +DefinedOrUnknownSVal ValueManager::getConjuredSymbolVal(const Expr *E, unsigned Count) { QualType T = E->getType(); if (!SymbolManager::canSymbolicate(T)) @@ -101,9 +102,10 @@ SVal ValueManager::getConjuredSymbolVal(const Expr *E, unsigned Count) { return nonloc::SymbolVal(sym); } -SVal ValueManager::getConjuredSymbolVal(const Expr *E, QualType T, - unsigned Count) { - +DefinedOrUnknownSVal ValueManager::getConjuredSymbolVal(const Expr *E, + QualType T, + unsigned Count) { + if (!SymbolManager::canSymbolicate(T)) return UnknownVal(); @@ -116,8 +118,9 @@ SVal ValueManager::getConjuredSymbolVal(const Expr *E, QualType T, } -SVal ValueManager::getDerivedRegionValueSymbolVal(SymbolRef parentSymbol, - const TypedRegion *R) { +DefinedOrUnknownSVal +ValueManager::getDerivedRegionValueSymbolVal(SymbolRef parentSymbol, + const TypedRegion *R) { QualType T = R->getValueType(R->getContext()); if (!SymbolManager::canSymbolicate(T)) @@ -131,7 +134,7 @@ SVal ValueManager::getDerivedRegionValueSymbolVal(SymbolRef parentSymbol, return nonloc::SymbolVal(sym); } -SVal ValueManager::getFunctionPointer(const FunctionDecl* FD) { +DefinedSVal ValueManager::getFunctionPointer(const FunctionDecl* FD) { CodeTextRegion *R = MemMgr.getCodeTextRegion(FD); return loc::MemRegionVal(R); } |