[cfe-commits] r85578 - in /cfe/trunk: lib/Analysis/GRExprEngine.cpp test/Analysis/misc-ps-region-store.m

Ted Kremenek kremenek at apple.com
Thu Oct 29 22:48:31 PDT 2009


Author: kremenek
Date: Fri Oct 30 00:48:30 2009
New Revision: 85578

URL: http://llvm.org/viewvc/llvm-project?rev=85578&view=rev
Log:
Handle loading of field	values from LazyCompoundVals in	GRExprEngine::VisitMemberExpr().
This fixes the crash reported in PR 5316.

Modified:
    cfe/trunk/lib/Analysis/GRExprEngine.cpp
    cfe/trunk/test/Analysis/misc-ps-region-store.m

Modified: cfe/trunk/lib/Analysis/GRExprEngine.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/GRExprEngine.cpp?rev=85578&r1=85577&r2=85578&view=diff

==============================================================================
--- cfe/trunk/lib/Analysis/GRExprEngine.cpp (original)
+++ cfe/trunk/lib/Analysis/GRExprEngine.cpp Fri Oct 30 00:48:30 2009
@@ -1092,13 +1092,26 @@
     // FIXME: Should we insert some assumption logic in here to determine
     // if "Base" is a valid piece of memory?  Before we put this assumption
     // later when using FieldOffset lvals (which we no longer have).
-    SVal L = state->getLValue(Field, state->getSVal(Base));
+    SVal BaseV = state->getSVal(Base);
+    
+    if (nonloc::LazyCompoundVal *LVC=dyn_cast<nonloc::LazyCompoundVal>(&BaseV)){
+      const LazyCompoundValData *D = LVC->getCVData();
+      const FieldRegion * FR =
+        getStateManager().getRegionManager().getFieldRegion(Field,
+                                                            D->getRegion());
 
-    if (asLValue)
-      MakeNode(Dst, M, *I, state->BindExpr(M, L),
-               ProgramPoint::PostLValueKind);
-    else
-      EvalLoad(Dst, M, *I, state, L);
+      SVal V = D->getState()->getSVal(loc::MemRegionVal(FR));
+      MakeNode(Dst, M, *I, state->BindExpr(M, V));
+    }
+    else {
+      SVal L = state->getLValue(Field, BaseV);
+
+      if (asLValue)
+        MakeNode(Dst, M, *I, state->BindExpr(M, L),
+                 ProgramPoint::PostLValueKind);
+      else
+        EvalLoad(Dst, M, *I, state, L);
+    }
   }
 }
 

Modified: cfe/trunk/test/Analysis/misc-ps-region-store.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/misc-ps-region-store.m?rev=85578&r1=85577&r2=85578&view=diff

==============================================================================
--- cfe/trunk/test/Analysis/misc-ps-region-store.m (original)
+++ cfe/trunk/test/Analysis/misc-ps-region-store.m Fri Oct 30 00:48:30 2009
@@ -415,3 +415,19 @@
  }
  return 0;
 }
+
+//===----------------------------------------------------------------------===//
+// PR 5316 - "crash when accessing field of lazy compound value"
+//  Previously this caused a crash at the MemberExpr '.chr' when loading
+//  a field value from a LazyCompoundVal
+//===----------------------------------------------------------------------===//
+
+typedef unsigned int pr5316_wint_t;
+typedef pr5316_wint_t pr5316_REFRESH_CHAR;
+typedef struct {
+  pr5316_REFRESH_CHAR chr;
+}
+pr5316_REFRESH_ELEMENT;
+static void pr5316(pr5316_REFRESH_ELEMENT *dst, const pr5316_REFRESH_ELEMENT *src) {
+  while ((*dst++ = *src++).chr != L'\0')  ;
+}





More information about the cfe-commits mailing list