diff options
Diffstat (limited to 'lib/StaticAnalyzer/Core/ProgramState.cpp')
-rw-r--r-- | lib/StaticAnalyzer/Core/ProgramState.cpp | 65 |
1 files changed, 62 insertions, 3 deletions
diff --git a/lib/StaticAnalyzer/Core/ProgramState.cpp b/lib/StaticAnalyzer/Core/ProgramState.cpp index 20f1e226b8..5730bc985a 100644 --- a/lib/StaticAnalyzer/Core/ProgramState.cpp +++ b/lib/StaticAnalyzer/Core/ProgramState.cpp @@ -732,11 +732,70 @@ bool ProgramState::isTainted(SymbolRef Sym, TaintTagType Kind) const { return Tainted; } +/// The GDM component containing the dynamic type info. This is a map from a +/// symbol to it's most likely type. +namespace clang { +namespace ento { +struct DynamicTypeMap {}; +typedef llvm::ImmutableMap<SymbolRef, DynamicTypeInfo> DynamicTypeMapImpl; +template<> struct ProgramStateTrait<DynamicTypeMap> + : public ProgramStatePartialTrait<DynamicTypeMapImpl> { + static void *GDMIndex() { static int index; return &index; } +}; +}} + DynamicTypeInfo ProgramState::getDynamicTypeInfo(const MemRegion *Reg) const { if (const TypedRegion *TR = dyn_cast<TypedRegion>(Reg)) return DynamicTypeInfo(TR->getLocationType()); - if (const SymbolicRegion *SR = dyn_cast<SymbolicRegion>(Reg)) - return DynamicTypeInfo(SR->getSymbol() - ->getType(getStateManager().getContext())); + + if (const SymbolicRegion *SR = dyn_cast<SymbolicRegion>(Reg)) { + SymbolRef Sym = SR->getSymbol(); + // Lookup the dynamic type in the GDM. + const DynamicTypeInfo *GDMType = get<DynamicTypeMap>(Sym); + if (GDMType) + return *GDMType; + + // Else, lookup the type at point of symbol creation. + return DynamicTypeInfo(Sym->getType(getStateManager().getContext())); + } return DynamicTypeInfo(); } + +ProgramStateRef ProgramState::addDynamicTypeInfo(const MemRegion *Reg, + QualType NewTy) const { + if (const SymbolicRegion *SR = dyn_cast<SymbolicRegion>(Reg)) { + SymbolRef Sym = SR->getSymbol(); + // TODO: Instead of resetting the type info, check the old type info and + // merge and pick the most precise type. + ProgramStateRef NewState = set<DynamicTypeMap>(Sym, DynamicTypeInfo(NewTy)); + assert(NewState); + return NewState; + } + return this; +} + + + + + + + + + + + + + + + + + + + + + + + + + + |