Enable stack-use-after-scope tests.
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>
Fri, 22 Apr 2016 00:10:23 +0000 (00:10 +0000)
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>
Fri, 22 Apr 2016 00:10:23 +0000 (00:10 +0000)
Fix and enable working stack-use-after-scope tests.
Add more failing tests for the feature, for fix later.

PR27453.

Patch by Vitaly Buka.

llvm-svn: 267084

compiler-rt/test/asan/TestCases/use-after-scope-capture.cc
compiler-rt/test/asan/TestCases/use-after-scope-dtor-order.cc
compiler-rt/test/asan/TestCases/use-after-scope-if.cc [new file with mode: 0644]
compiler-rt/test/asan/TestCases/use-after-scope-inlined.cc
compiler-rt/test/asan/TestCases/use-after-scope-loop-bug.cc [new file with mode: 0644]
compiler-rt/test/asan/TestCases/use-after-scope-loop-removed.cc [new file with mode: 0644]
compiler-rt/test/asan/TestCases/use-after-scope-loop.cc [new file with mode: 0644]
compiler-rt/test/asan/TestCases/use-after-scope-nobug.cc
compiler-rt/test/asan/TestCases/use-after-scope-temp.cc
compiler-rt/test/asan/TestCases/use-after-scope.cc

index 28c99b4..4ea16af 100644 (file)
@@ -1,14 +1,17 @@
-// RUN: %clangxx_asan -O0 -fsanitize=use-after-scope %s -o %t && %run %t
-// XFAIL: *
+// RUN: %clangxx_asan -std=c++11 -O1 -mllvm -asan-use-after-scope=1 %s -o %t && \
+// RUN:     not %run %t 2>&1 | FileCheck %s
+
+#include <functional>
 
 int main() {
   std::function<int()> f;
   {
     int x = 0;
     f = [&x]() {
-      return x;
-    }
+      return x;  // BOOM
+      // CHECK: ERROR: AddressSanitizer: stack-use-after-scope
+      // CHECK: #0 0x{{.*}} in {{.*}}::operator()(){{.*}}.cc:[[@LINE-2]]
+    };
   }
   return f();  // BOOM
-  // CHECK: ERROR: AddressSanitizer: stack-use-after-scope
 }
index 7896dd3..4b16df7 100644 (file)
@@ -1,6 +1,6 @@
-// RUN: %clangxx_asan -O0 -fsanitize=use-after-scope %s -o %t && \
+// RUN: %clangxx_asan -O1 -mllvm -asan-use-after-scope=1 %s -o %t && \
 // RUN:     not %run %t 2>&1 | FileCheck %s
-// XFAIL: *
+
 #include <stdio.h>
 
 struct IntHolder {
@@ -8,7 +8,7 @@ struct IntHolder {
   ~IntHolder() {
     printf("Value: %d\n", *val_);  // BOOM
     // CHECK: ERROR: AddressSanitizer: stack-use-after-scope
-    // CHECK:  #0 0x{{.*}} in IntHolder::~IntHolder{{.*}}use-after-scope-dtor-order.cc:[[@LINE-2]]
+    // CHECK:  #0 0x{{.*}} in IntHolder::~IntHolder{{.*}}.cc:[[@LINE-2]]
   }
   void set(int *val) { val_ = val; }
   int *get() { return val_; }
diff --git a/compiler-rt/test/asan/TestCases/use-after-scope-if.cc b/compiler-rt/test/asan/TestCases/use-after-scope-if.cc
new file mode 100644 (file)
index 0000000..8779161
--- /dev/null
@@ -0,0 +1,15 @@
+// RUN: %clangxx_asan -O1 -mllvm -asan-use-after-scope=1 %s -o %t && \
+// RUN:     not %run %t 2>&1 | FileCheck %s
+
+int *p;
+bool b = true;
+
+int main() {
+  if (b) {
+    int x[5];
+    p = x+1;
+  }
+  return *p;  // BOOM
+  // CHECK: ERROR: AddressSanitizer: stack-use-after-scope
+  // CHECK:  #0 0x{{.*}} in main {{.*}}.cc:[[@LINE-2]]
+}
index a0a0d94..7146d90 100644 (file)
@@ -2,8 +2,8 @@
 // happens. "always_inline" is not enough, as Clang doesn't emit
 // llvm.lifetime intrinsics at -O0.
 //
-// RUN: %clangxx_asan -O2 -fsanitize=use-after-scope %s -o %t && not %run %t 2>&1 | FileCheck %s
-// XFAIL: *
+// RUN: %clangxx_asan -O2 -mllvm -asan-use-after-scope=1 %s -o %t && \
+// RUN:     not %run %t 2>&1 | FileCheck %s
 
 int *arr;
 
diff --git a/compiler-rt/test/asan/TestCases/use-after-scope-loop-bug.cc b/compiler-rt/test/asan/TestCases/use-after-scope-loop-bug.cc
new file mode 100644 (file)
index 0000000..6d8e888
--- /dev/null
@@ -0,0 +1,16 @@
+// RUN: %clangxx_asan -O1 -mllvm -asan-use-after-scope=1 %s -o %t && \
+// RUN:     not %run %t 2>&1 | FileCheck %s
+//
+// FIXME: @llvm.lifetime.* are not emitted for x.
+// XFAIL: *
+
+int *p;
+
+int main() {
+  // Variable goes in and out of scope.
+  for (int i = 0; i < 3; ++i) {
+    int x[3] = {i, i, i};
+    p = x + i;
+  }
+  return *p;  // BOOM
+}
diff --git a/compiler-rt/test/asan/TestCases/use-after-scope-loop-removed.cc b/compiler-rt/test/asan/TestCases/use-after-scope-loop-removed.cc
new file mode 100644 (file)
index 0000000..a9ea450
--- /dev/null
@@ -0,0 +1,19 @@
+// RUN: %clangxx_asan -O1 -mllvm -asan-use-after-scope=1 %s -o %t && \
+// RUN:     not %run %t 2>&1 | FileCheck %s
+//
+// FIXME: Compiler removes for-loop but keeps x variable. For unknown reason
+// @llvm.lifetime.* are not emitted for x.
+// XFAIL: *
+
+#include <stdlib.h>
+
+int *p;
+
+int main() {
+  for (int i = 0; i < 3; i++) {
+    int x;
+    p = &x;
+  }
+  return **p;  // BOOM
+  // CHECK: ERROR: AddressSanitizer: stack-use-after-scope
+}
diff --git a/compiler-rt/test/asan/TestCases/use-after-scope-loop.cc b/compiler-rt/test/asan/TestCases/use-after-scope-loop.cc
new file mode 100644 (file)
index 0000000..dc96239
--- /dev/null
@@ -0,0 +1,14 @@
+// RUN: %clangxx_asan -O1 -mllvm -asan-use-after-scope=1 %s -o %t && \
+// RUN:     not %run %t 2>&1 | FileCheck %s
+
+int *p[3];
+
+int main() {
+  for (int i = 0; i < 3; i++) {
+    int x;
+    p[i] = &x;
+  }
+  return **p;  // BOOM
+  // CHECK: ERROR: AddressSanitizer: stack-use-after-scope
+  // CHECK: #0 0x{{.*}} in main {{.*}}.cc:[[@LINE-2]]
+}
index 21b085c..b7bf8ca 100644 (file)
@@ -1,14 +1,15 @@
-// RUN: %clangxx_asan -O0 -fsanitize=use-after-scope %s -o %t && %run %t
-// XFAIL: *
+// RUN: %clangxx_asan -O1 -mllvm -asan-use-after-scope=1 %s -o %t && %run %t
 
 #include <stdio.h>
+#include <stdlib.h>
+
+int *p[3];
 
 int main() {
-  int *p = 0;
   // Variable goes in and out of scope.
   for (int i = 0; i < 3; i++) {
-    int x = 0;
-    p = &x;
+    int x;
+    p[i] = &x;
   }
   printf("PASSED\n");
   return 0;
index f9bd779..b238d85 100644 (file)
@@ -1,15 +1,10 @@
-// RUN: %clangxx_asan -O0 -fsanitize=use-after-scope %s -o %t && \
-// RUN:     %run %t 2>&1 | FileCheck %s
+// RUN: %clangxx_asan -O1 -mllvm -asan-use-after-scope=1 %s -o %t && \
+// RUN:     not %run %t 2>&1 | FileCheck %s
 //
 // Lifetime for temporaries is not emitted yet.
 // XFAIL: *
 
-#include <stdio.h>
-
 struct IntHolder {
-  explicit IntHolder(int val) : val(val) {
-    printf("IntHolder: %d\n", val);
-  }
   int val;
 };
 
@@ -20,10 +15,9 @@ void save(const IntHolder &holder) {
 }
 
 int main(int argc, char *argv[]) {
-  save(IntHolder(10));
+  save({10});
   int x = saved->val;  // BOOM
-  // CHECK: ERROR: AddressSanitizer: stack-use-after-scope
-  // CHECK:  #0 0x{{.*}} in main {{.*}}use-after-scope-temp.cc:[[@LINE-2]]
-  printf("saved value: %d\n", x);
-  return 0;
+// CHECK: ERROR: AddressSanitizer: stack-use-after-scope
+// CHECK:  #0 0x{{.*}} in main {{.*}}use-after-scope-temp.cc:[[@LINE-2]]
+  return x;
 }
index 59a0e0c..e1f7302 100644 (file)
@@ -1,10 +1,9 @@
-// RUN: %clangxx_asan -O0 -fsanitize=use-after-scope %s -o %t && \
-// RUN: not %run %t 2>&1 | FileCheck %s
-// RUN: %env_asan_opts=detect_stack_use_after_return=1 not %run %t 2>&1 | FileCheck %s
-// XFAIL: *
+// RUN: %clangxx_asan -O1 -mllvm -asan-use-after-scope=1 %s -o %t && \
+// RUN:     not %run %t 2>&1 | FileCheck %s
+
+int *p = 0;
 
 int main() {
-  int *p = 0;
   {
     int x = 0;
     p = &x;