diff options
Diffstat (limited to 'clang/include/clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h')
-rw-r--r-- | clang/include/clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h | 42 |
1 files changed, 34 insertions, 8 deletions
diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h index 4ea85f9730bb..87a49cf4ffe9 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h @@ -72,13 +72,27 @@ protected: /// The width of the scalar type used for array indices. const unsigned ArrayIndexWidth; - virtual SVal evalCastFromNonLoc(NonLoc val, QualType castTy) = 0; - virtual SVal evalCastFromLoc(Loc val, QualType castTy) = 0; - -public: - // FIXME: Make these protected again once RegionStoreManager correctly - // handles loads from different bound value types. - virtual SVal dispatchCast(SVal val, QualType castTy) = 0; + SVal evalCastKind(UndefinedVal V, QualType CastTy, QualType OriginalTy); + SVal evalCastKind(UnknownVal V, QualType CastTy, QualType OriginalTy); + SVal evalCastKind(Loc V, QualType CastTy, QualType OriginalTy); + SVal evalCastKind(NonLoc V, QualType CastTy, QualType OriginalTy); + SVal evalCastSubKind(loc::ConcreteInt V, QualType CastTy, + QualType OriginalTy); + SVal evalCastSubKind(loc::GotoLabel V, QualType CastTy, QualType OriginalTy); + SVal evalCastSubKind(loc::MemRegionVal V, QualType CastTy, + QualType OriginalTy); + SVal evalCastSubKind(nonloc::CompoundVal V, QualType CastTy, + QualType OriginalTy); + SVal evalCastSubKind(nonloc::ConcreteInt V, QualType CastTy, + QualType OriginalTy); + SVal evalCastSubKind(nonloc::LazyCompoundVal V, QualType CastTy, + QualType OriginalTy); + SVal evalCastSubKind(nonloc::LocAsInteger V, QualType CastTy, + QualType OriginalTy); + SVal evalCastSubKind(nonloc::SymbolVal V, QualType CastTy, + QualType OriginalTy); + SVal evalCastSubKind(nonloc::PointerToMember V, QualType CastTy, + QualType OriginalTy); public: SValBuilder(llvm::BumpPtrAllocator &alloc, ASTContext &context, @@ -102,7 +116,7 @@ public: Ty2->isIntegralOrEnumerationType())); } - SVal evalCast(SVal val, QualType castTy, QualType originalType); + SVal evalCast(SVal V, QualType CastTy, QualType OriginalTy); // Handles casts of type CK_IntegralCast. SVal evalIntegralCast(ProgramStateRef state, SVal val, QualType castTy, @@ -224,6 +238,14 @@ public: const LocationContext *LCtx, unsigned Count); + /// Conjure a symbol representing heap allocated memory region. + /// + /// Note, now, the expression *doesn't* need to represent a location. + /// But the type need to! + DefinedOrUnknownSVal getConjuredHeapSymbolVal(const Expr *E, + const LocationContext *LCtx, + QualType type, unsigned Count); + DefinedOrUnknownSVal getDerivedRegionValueSymbolVal( SymbolRef parentSymbol, const TypedValueRegion *region); @@ -366,6 +388,10 @@ public: return loc::ConcreteInt(BasicVals.getValue(integer)); } + /// Return MemRegionVal on success cast, otherwise return None. + Optional<loc::MemRegionVal> getCastedMemRegionVal(const MemRegion *region, + QualType type); + /// Make an SVal that represents the given symbol. This follows the convention /// of representing Loc-type symbols (symbolic pointers and references) /// as Loc values wrapping the symbol rather than as plain symbol values. |