summaryrefslogtreecommitdiffstats
path: root/compiler-rt/lib/asan/lit_tests/deep_thread_stack.cc
diff options
context:
space:
mode:
authorAlexey Samsonov <samsonov@google.com>2012-09-05 07:37:15 +0000
committerAlexey Samsonov <samsonov@google.com>2012-09-05 07:37:15 +0000
commitc402cb62fd5ae6a664d0f65593dbd759e229d332 (patch)
treec881a5a5fbc7abe2ba00a1104f8326e78f55cb70 /compiler-rt/lib/asan/lit_tests/deep_thread_stack.cc
parent2fa38f8ce07466e8a80716ee575c38066dab1f80 (diff)
downloadbcm5719-llvm-c402cb62fd5ae6a664d0f65593dbd759e229d332.tar.gz
bcm5719-llvm-c402cb62fd5ae6a664d0f65593dbd759e229d332.zip
[ASan] Add print_full_thread_history runtime option (on by default) that prints all full thread creation paths for threads involved in ASan error report
llvm-svn: 163200
Diffstat (limited to 'compiler-rt/lib/asan/lit_tests/deep_thread_stack.cc')
-rw-r--r--compiler-rt/lib/asan/lit_tests/deep_thread_stack.cc61
1 files changed, 61 insertions, 0 deletions
diff --git a/compiler-rt/lib/asan/lit_tests/deep_thread_stack.cc b/compiler-rt/lib/asan/lit_tests/deep_thread_stack.cc
new file mode 100644
index 00000000000..810f4e4971b
--- /dev/null
+++ b/compiler-rt/lib/asan/lit_tests/deep_thread_stack.cc
@@ -0,0 +1,61 @@
+// RUN: %clangxx_asan -m64 -O0 %s -o %t && %t 2>&1 | %symbolize | FileCheck %s
+// RUN: %clangxx_asan -m64 -O1 %s -o %t && %t 2>&1 | %symbolize | FileCheck %s
+// RUN: %clangxx_asan -m64 -O2 %s -o %t && %t 2>&1 | %symbolize | FileCheck %s
+// RUN: %clangxx_asan -m64 -O3 %s -o %t && %t 2>&1 | %symbolize | FileCheck %s
+// RUN: %clangxx_asan -m32 -O0 %s -o %t && %t 2>&1 | %symbolize | FileCheck %s
+// RUN: %clangxx_asan -m32 -O1 %s -o %t && %t 2>&1 | %symbolize | FileCheck %s
+// RUN: %clangxx_asan -m32 -O2 %s -o %t && %t 2>&1 | %symbolize | FileCheck %s
+// RUN: %clangxx_asan -m32 -O3 %s -o %t && %t 2>&1 | %symbolize | FileCheck %s
+
+#include <pthread.h>
+
+int *x;
+
+void *AllocThread(void *arg) {
+ x = new int;
+ *x = 42;
+ return NULL;
+}
+
+void *FreeThread(void *arg) {
+ delete x;
+ return NULL;
+}
+
+void *AccessThread(void *arg) {
+ *x = 43; // BOOM
+ return NULL;
+}
+
+typedef void* (*callback_type)(void* arg);
+
+void *RunnerThread(void *function) {
+ pthread_t thread;
+ pthread_create(&thread, NULL, (callback_type)function, NULL);
+ pthread_join(thread, NULL);
+ return NULL;
+}
+
+void RunThread(callback_type function) {
+ pthread_t runner;
+ pthread_create(&runner, NULL, RunnerThread, (void*)function);
+ pthread_join(runner, NULL);
+}
+
+int main(int argc, char *argv[]) {
+ RunThread(AllocThread);
+ RunThread(FreeThread);
+ RunThread(AccessThread);
+ return (x != 0);
+}
+
+// CHECK: AddressSanitizer heap-use-after-free
+// CHECK: WRITE of size 4 at 0x{{.*}} thread T[[ACCESS_THREAD:[0-9]+]]
+// CHECK: freed by thread T[[FREE_THREAD:[0-9]+]] here:
+// CHECK: previously allocated by thread T[[ALLOC_THREAD:[0-9]+]] here:
+// CHECK: Thread T[[ACCESS_THREAD]] created by T[[ACCESS_RUNNER:[0-9]+]] here:
+// CHECK: Thread T[[ACCESS_RUNNER]] created by T0 here:
+// CHECK: Thread T[[FREE_THREAD]] created by T[[FREE_RUNNER:[0-9]+]] here:
+// CHECK: Thread T[[FREE_RUNNER]] created by T0 here:
+// CHECK: Thread T[[ALLOC_THREAD]] created by T[[ALLOC_RUNNER:[0-9]+]] here:
+// CHECK: Thread T[[ALLOC_RUNNER]] created by T0 here:
OpenPOWER on IntegriCloud