diff options
author | Jordan Rose <jordan_rose@apple.com> | 2012-08-13 23:59:07 +0000 |
---|---|---|
committer | Jordan Rose <jordan_rose@apple.com> | 2012-08-13 23:59:07 +0000 |
commit | f41c0dd023b2990eee0296390a88641d157777f7 (patch) | |
tree | 7c241d729857fb26852258a27f73eff484ccebfd /lib/StaticAnalyzer/Core/ProgramState.cpp | |
parent | 645baeed6800f952e9ad1d5666e01080385531a2 (diff) |
[analyzer] Look up DynamicTypeInfo by region instead of symbol.
This allows us to store type info for non-symbolic regions.
No functionality change.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@161811 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/StaticAnalyzer/Core/ProgramState.cpp')
-rw-r--r-- | lib/StaticAnalyzer/Core/ProgramState.cpp | 32 |
1 files changed, 14 insertions, 18 deletions
diff --git a/lib/StaticAnalyzer/Core/ProgramState.cpp b/lib/StaticAnalyzer/Core/ProgramState.cpp index 0e5ff785bf..dc988cc5f1 100644 --- a/lib/StaticAnalyzer/Core/ProgramState.cpp +++ b/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<SymbolRef, DynamicTypeInfo> DynamicTypeMapImpl; +typedef llvm::ImmutableMap<const MemRegion *, DynamicTypeInfo> DynamicTypeMap; template<> struct ProgramStateTrait<DynamicTypeMap> - : public ProgramStatePartialTrait<DynamicTypeMapImpl> { + : public ProgramStatePartialTrait<DynamicTypeMap> { 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()); + // Look up the dynamic type in the GDM. + const DynamicTypeInfo *GDMType = get<DynamicTypeMap>(Reg); + if (GDMType) + return *GDMType; + + // Otherwise, fall back to what we know about the region. + if (const TypedValueRegion *TR = dyn_cast<TypedValueRegion>(Reg)) + return DynamicTypeInfo(TR->getValueType()); 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::setDynamicTypeInfo(const MemRegion *Reg, DynamicTypeInfo NewTy) const { - if (const SymbolicRegion *SR = dyn_cast<SymbolicRegion>(Reg)) { - SymbolRef Sym = SR->getSymbol(); - ProgramStateRef NewState = set<DynamicTypeMap>(Sym, NewTy); - assert(NewState); - return NewState; - } - return this; + ProgramStateRef NewState = set<DynamicTypeMap>(Reg, NewTy); + assert(NewState); + return NewState; } |