From e521f932250d5a72096eb0a43a6fbf0a80c0d59c Mon Sep 17 00:00:00 2001 From: Jordan Rose Date: Mon, 13 Aug 2012 23:59:07 +0000 Subject: [analyzer] Look up DynamicTypeInfo by region instead of symbol. This allows us to store type info for non-symbolic regions. No functionality change. llvm-svn: 161811 --- clang/lib/StaticAnalyzer/Core/ProgramState.cpp | 32 +++++++++++--------------- 1 file changed, 14 insertions(+), 18 deletions(-) (limited to 'clang') diff --git a/clang/lib/StaticAnalyzer/Core/ProgramState.cpp b/clang/lib/StaticAnalyzer/Core/ProgramState.cpp index 0e5ff785bff..dc988cc5f1f 100644 --- a/clang/lib/StaticAnalyzer/Core/ProgramState.cpp +++ b/clang/lib/StaticAnalyzer/Core/ProgramState.cpp @@ -737,38 +737,34 @@ bool ProgramState::isTainted(SymbolRef Sym, TaintTagType Kind) const { /// symbol to it's most likely type. namespace clang { namespace ento { -struct DynamicTypeMap {}; -typedef llvm::ImmutableMap DynamicTypeMapImpl; +typedef llvm::ImmutableMap DynamicTypeMap; template<> struct ProgramStateTrait - : public ProgramStatePartialTrait { + : public ProgramStatePartialTrait { static void *GDMIndex() { static int index; return &index; } }; }} DynamicTypeInfo ProgramState::getDynamicTypeInfo(const MemRegion *Reg) const { - if (const TypedRegion *TR = dyn_cast(Reg)) - return DynamicTypeInfo(TR->getLocationType()); + // Look up the dynamic type in the GDM. + const DynamicTypeInfo *GDMType = get(Reg); + if (GDMType) + return *GDMType; + + // Otherwise, fall back to what we know about the region. + if (const TypedValueRegion *TR = dyn_cast(Reg)) + return DynamicTypeInfo(TR->getValueType()); if (const SymbolicRegion *SR = dyn_cast(Reg)) { SymbolRef Sym = SR->getSymbol(); - // Lookup the dynamic type in the GDM. - const DynamicTypeInfo *GDMType = get(Sym); - if (GDMType) - return *GDMType; - - // Else, lookup the type at point of symbol creation. return DynamicTypeInfo(Sym->getType(getStateManager().getContext())); } + return DynamicTypeInfo(); } ProgramStateRef ProgramState::setDynamicTypeInfo(const MemRegion *Reg, DynamicTypeInfo NewTy) const { - if (const SymbolicRegion *SR = dyn_cast(Reg)) { - SymbolRef Sym = SR->getSymbol(); - ProgramStateRef NewState = set(Sym, NewTy); - assert(NewState); - return NewState; - } - return this; + ProgramStateRef NewState = set(Reg, NewTy); + assert(NewState); + return NewState; } -- cgit v1.2.3