]> granicus.if.org Git - clang/commitdiff
Enabled relaxed LiveVariables analysis in the path-sensitive engine to increase the...
authorTom Care <tom.care@uqconnect.edu.au>
Fri, 27 Aug 2010 22:46:32 +0000 (22:46 +0000)
committerTom Care <tom.care@uqconnect.edu.au>
Fri, 27 Aug 2010 22:46:32 +0000 (22:46 +0000)
- Migrated a temporarily separated test back to its original file (bug has been fixed, null-deref-ps-temp.c -> null-deref-ps.c)
- Changed SymbolManager to use relaxed LiveVariables
- Updated several test cases that the IdempotentOperationChecker class now flags
- Added test case to test relaxed LiveVariables use by the IdempotentOperationChecker

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@112312 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Checker/SymbolManager.cpp
test/Analysis/func.c
test/Analysis/idempotent-operations.c
test/Analysis/misc-ps-region-store.m
test/Analysis/misc-ps.m
test/Analysis/null-deref-ps-temp.c [deleted file]
test/Analysis/null-deref-ps.c

index 7ab356d473d8fba83b871fa793a7e615ca26574f..3b1bb6d98d95cc38a3f8dad54494573bc3ada9cf 100644 (file)
@@ -324,7 +324,8 @@ bool SymbolReaper::isLive(SymbolRef sym) {
 }
 
 bool SymbolReaper::isLive(const Stmt* ExprVal) const {
-  return LCtx->getLiveVariables()->isLive(Loc, ExprVal);
+  return LCtx->getAnalysisContext()->getRelaxedLiveVariables()->
+      isLive(Loc, ExprVal);
 }
 
 bool SymbolReaper::isLive(const VarRegion *VR) const {
@@ -332,7 +333,8 @@ bool SymbolReaper::isLive(const VarRegion *VR) const {
   const StackFrameContext *CurrentContext = LCtx->getCurrentStackFrame();
 
   if (VarContext == CurrentContext)
-    return LCtx->getLiveVariables()->isLive(Loc, VR->getDecl());
+    return LCtx->getAnalysisContext()->getRelaxedLiveVariables()->
+        isLive(Loc, VR->getDecl());
 
   return VarContext->isParentOf(CurrentContext);
 }
index 53c873df55a95a7bf92ac24da6e9b79ba6c8e01e..a7e84615fd392a6468e590eacbfafbefae78643e 100644 (file)
@@ -4,7 +4,7 @@
 void f(void) {
   void (*p)(void);
   p = f;
-  p = &f;
+  p = &f; // expected-warning{{Assigned value is always the same as the existing value}}
   p();
   (*p)();
 }
index 09df6dece0b3632e126ff6d2cc99d9e68a6dd8fe..debff0efff41a8df4364f05858d1ccdd62b95927 100644 (file)
@@ -78,6 +78,20 @@ void bailout() {
   }
 }
 
+// Relaxed liveness - check that we don't kill liveness at assignments
+typedef unsigned uintptr_t;
+void kill_at_assign() {
+  short array[2];
+  uintptr_t x = array; // expected-warning{{incompatible pointer to integer conversion}}
+  short *p = x; // expected-warning{{incompatible integer to pointer conversion}}
+
+  // The following branch should be infeasible.
+  if (!(p = &array[0])) { // expected-warning{{Assigned value is always the same as the existing value}}
+    p = 0;
+    *p = 1; // no-warning
+  }
+}
+
 // False positive tests
 
 unsigned false1() {
index 9c2add0167a9b0a9e6813a162d8ca1d4cc41cf0f..d46437388d32270448c5742b3eaf24901737f568 100644 (file)
@@ -253,7 +253,7 @@ void rdar_7249327(unsigned int A[2*32]) {
   a = A;
   b = B;
   
-  n = *a++;
+  n = *a++; // expected-warning{{Assigned value is always the same as the existing value}}
   if (n)
     x += *b++; // no-warning
 }
@@ -708,7 +708,7 @@ int pr5857(char *src) {
   long long *z = (long long *) (intptr_t) src;
   long long w = 0;
   int n = 0;
-  for (n = 0; n < y; ++n) {
+  for (n = 0; n < y; ++n) { // expected-warning{{Assigned value is always the same as the existing value}}
     // Previously we crashed analyzing this statement.
     w = *z++;
   }
index ced0853574d3d40d9489f277b9d8288f49c5ce99..1aa80bd89fe8c1577cf23c591713f845d0a78008 100644 (file)
@@ -458,7 +458,7 @@ void rdar_7062158_2() {
 // ElementRegion is created.
 unsigned char test_array_index_bitwidth(const unsigned char *p) {
   unsigned short i = 0;
-  for (i = 0; i < 2; i++) p = &p[i];  
+  for (i = 0; i < 2; i++) p = &p[i]; // expected-warning{{Assigned value is always the same as the existing value}}
   return p[i+1];
 }
 
diff --git a/test/Analysis/null-deref-ps-temp.c b/test/Analysis/null-deref-ps-temp.c
deleted file mode 100644 (file)
index 90b6ed3..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-// RUN: %clang_cc1 -triple i386-apple-darwin10 -analyze -analyzer-experimental-internal-checks -std=gnu99 -analyzer-check-objc-mem -analyzer-store=region -analyzer-constraints=range -analyzer-no-purge-dead -verify %s -Wreturn-type
-
-// This is a temporary file to isolate a test case that would cause a failure
-// only some of the time in null-deref-ps.c. The idempotent operations checker
-// has revealed a bug on line 18 ('=' instead of '==') when the
-// -analyzer-no-purge-dead flag is passed to cc1. Some fundamental design
-// changes are needed to make this work without the -analyzer-no-purge-dead flag
-// and this test will be integrated back into the main file when this happens.
-
-typedef unsigned uintptr_t;
-
-int f4_b() {
-  short array[2];
-  uintptr_t x = array; // expected-warning{{incompatible pointer to integer conversion}}
-  short *p = x; // expected-warning{{incompatible integer to pointer conversion}}
-
-  // The following branch should be infeasible.
-  if (!(p = &array[0])) { // expected-warning{{Assigned value is always the same as the existing value}}
-    p = 0;
-    *p = 1; // no-warning
-  }
-
-  if (p) {
-    *p = 5; // no-warning
-    p = 0;
-  }
-  else return; // expected-warning {{non-void function 'f4_b' should return a value}}
-
-  *p += 10; // expected-warning{{Dereference of null pointer}}
-  return 0;
-}
index 356e2b4d0f7a894eecaccbf11c883ca0b5be3963..d0e4f61521a086903d14f9ad67fbb8dff3098af2 100644 (file)
@@ -60,7 +60,26 @@ int f4(int *p) {
   return *q; // expected-warning{{Dereference of null pointer (loaded from variable 'q')}}
 }
 
-// Placeholder for f4_b, temporarily moved to null-deref-ps-temp.c
+int f4_b() {
+  short array[2];
+  uintptr_t x = array; // expected-warning{{incompatible pointer to integer conversion}}
+  short *p = x; // expected-warning{{incompatible integer to pointer conversion}}
+
+  // The following branch should be infeasible.
+  if (!(p == &array[0])) {
+    p = 0;
+    *p = 1; // no-warning
+  }
+
+  if (p) {
+    *p = 5; // no-warning
+    p = 0;
+  }
+  else return; // expected-warning {{non-void function 'f4_b' should return a value}}
+
+  *p += 10; // expected-warning{{Dereference of null pointer}}
+  return 0;
+}
 
 int f5() {