]> granicus.if.org Git - clang/commitdiff
Invalidate the alloca region by setting its default value to conjured symbol.
authorZhongxing Xu <xuzhongxing@gmail.com>
Mon, 29 Jun 2009 06:43:40 +0000 (06:43 +0000)
committerZhongxing Xu <xuzhongxing@gmail.com>
Mon, 29 Jun 2009 06:43:40 +0000 (06:43 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@74419 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/CFRefCount.cpp
test/Analysis/array-struct.c

index 1010b65209f80c6b92cd49a69f946d07f4ea1356..618214e1c576f8b6de014782a47839d9aeaedd4d 100644 (file)
@@ -2796,7 +2796,7 @@ void CFRefCount::EvalSummary(ExplodedNodeSet<GRState>& Dst,
         //  to identify conjured symbols by an expression pair: the enclosing
         //  expression (the context) and the expression itself.  This should
         //  disambiguate conjured symbols. 
-        
+        unsigned Count = Builder.getCurrentBlockCount();
         const TypedRegion* R = dyn_cast<TypedRegion>(MR->getRegion());
 
         if (R) {
@@ -2833,7 +2833,7 @@ void CFRefCount::EvalSummary(ExplodedNodeSet<GRState>& Dst,
           
           if (R->isBoundable()) {
             // Set the value of the variable to be a conjured symbol.
-            unsigned Count = Builder.getCurrentBlockCount();
+
             QualType T = R->getValueType(Ctx);
           
             if (Loc::IsLocType(T) || (T->isIntegerType() && T->isScalarType())){
@@ -2895,6 +2895,15 @@ void CFRefCount::EvalSummary(ExplodedNodeSet<GRState>& Dst,
             }
           }
         }
+        else if (isa<AllocaRegion>(MR->getRegion())) {
+          // Invalidate the alloca region by setting its default value to 
+          // conjured symbol. The type of the symbol is irrelavant.
+          SVal V = ValMgr.getConjuredSymbolVal(*I, Eng.getContext().IntTy, 
+                                               Count);
+          StoreManager& StoreMgr = 
+                    Eng.getStateManager().getStoreManager();
+          state = StoreMgr.setDefaultValue(state, MR->getRegion(), V);
+        }
         else
           state = state->bindLoc(*MR, UnknownVal());
       }
index 13035760fa8bf963f7878c68c9632f5fff83b250..da7df4b28e3030205015564572f2bd5adbd3bb1d 100644 (file)
@@ -168,3 +168,15 @@ void f17() {
   if (t.e.d)
     x = 1;
 }
+
+void read(char*);
+
+void f18() {
+  char *q;
+  char *p = (char *) __builtin_alloca(10);
+  read(p);
+  q = p;
+  q++;
+  if (*q) { // no-warning
+  }
+}