]> granicus.if.org Git - clang/commitdiff
Return UnknownVal for pointer arithmetic on struct fields.
authorZhongxing Xu <xuzhongxing@gmail.com>
Sun, 21 Jun 2009 13:24:24 +0000 (13:24 +0000)
committerZhongxing Xu <xuzhongxing@gmail.com>
Sun, 21 Jun 2009 13:24:24 +0000 (13:24 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@73851 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/RegionStore.cpp
test/Analysis/fields.c

index 6f316c9c5921a114bfa7893558263638a3e4d685..5f2b8f809de31db4dac2eadc4a94306066c52c03 100644 (file)
@@ -773,8 +773,13 @@ SVal RegionStoreManager::EvalBinOp(const GRState *state,
     SVal ZeroIdx = ValMgr.makeZeroArrayIndex();
     ER = MRMgr.getElementRegion(EleTy, ZeroIdx, AR, getContext());
   } 
-  else
+  else if (isa<FieldRegion>(MR)) {
+    // Not track pointer arithmetic on struct fields.
+    return UnknownVal();
+  }
+  else {
     ER = cast<ElementRegion>(MR);
+  }
 
   SVal Idx = ER->getIndex();
 
index c012a9da7b8102e51c807923c303e5039d2f6854..900a6d6869acc8dcd5db4fee006a59fde4228765 100644 (file)
@@ -8,3 +8,12 @@ void bar() {
   *(unsigned*)&y = foo();
   y.x = 1;
 }
+
+struct s {
+  int n;
+};
+
+void f() {
+  struct s a;
+  int *p = &(a.n) + 1;
+}