]> granicus.if.org Git - clang/commitdiff
Fix to BasicStoreManager::getElementLValue: If the base region is a symbol, layer...
authorTed Kremenek <kremenek@apple.com>
Tue, 9 Dec 2008 23:50:57 +0000 (23:50 +0000)
committerTed Kremenek <kremenek@apple.com>
Tue, 9 Dec 2008 23:50:57 +0000 (23:50 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60808 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/BasicStore.cpp

index 31d392e80f44878cdaf23f44c977df6f6bbe4f02..207f60960906aba98cad9948ef178486ecf2962e 100644 (file)
@@ -174,9 +174,20 @@ SVal BasicStoreManager::getLValueElement(const GRState* St, SVal Base,
   const MemRegion* BaseR = 0;
   
   switch(BaseL.getSubKind()) {
-    case loc::SymbolValKind:
-      BaseR = MRMgr.getSymbolicRegion(cast<loc::SymbolVal>(&BaseL)->getSymbol());
+    case loc::SymbolValKind: {
+      // FIXME: Should we have symbolic regions be typed or typeless?
+      //  Here we assume that these regions are typeless, even though the
+      //  symbol is typed.
+      SymbolRef Sym = cast<loc::SymbolVal>(&BaseL)->getSymbol();
+      // Create a region to represent this symbol.
+      // FIXME: In the future we may just use symbolic regions instead of
+      //  SymbolVals to reason about symbolic memory chunks.
+      const MemRegion* SymR = MRMgr.getSymbolicRegion(Sym);
+      // Layered a typed region on top of this.
+      QualType T = StateMgr.getSymbolManager().getType(Sym);
+      BaseR = MRMgr.getAnonTypedRegion(T, SymR);
       break;
+    }
       
     case loc::GotoLabelKind:
     case loc::FuncValKind: