From 0a3e932e1d47083922fbb48e46cf9ef10a4a1b3f Mon Sep 17 00:00:00 2001 From: Vitaly Buka Date: Fri, 22 Jul 2016 00:58:06 +0000 Subject: [PATCH] Add test to check detection of stack-use-after-scope on various types Summary: Test for D22657 PR27453 Reviewers: kcc, eugenis Subscribers: kubabrecka Differential Revision: https://reviews.llvm.org/D22658 llvm-svn: 276375 --- .../test/asan/TestCases/use-after-scope-chars.cc | 15 ---- .../test/asan/TestCases/use-after-scope-types.cc | 79 ++++++++++++++++++++++ 2 files changed, 79 insertions(+), 15 deletions(-) delete mode 100644 compiler-rt/test/asan/TestCases/use-after-scope-chars.cc create mode 100644 compiler-rt/test/asan/TestCases/use-after-scope-types.cc diff --git a/compiler-rt/test/asan/TestCases/use-after-scope-chars.cc b/compiler-rt/test/asan/TestCases/use-after-scope-chars.cc deleted file mode 100644 index 51fc5fa..0000000 --- a/compiler-rt/test/asan/TestCases/use-after-scope-chars.cc +++ /dev/null @@ -1,15 +0,0 @@ -// RUN: %clangxx_asan -O1 -fsanitize-address-use-after-scope %s -o %t && \ -// RUN: not %run %t 2>&1 | FileCheck %s -// XFAIL: * - -// FIXME: This works only for arraysize <= 8. - -char *p = 0; - -int main() { - { - char x[1024] = {}; - p = x; - } - return *p; // BOOM -} diff --git a/compiler-rt/test/asan/TestCases/use-after-scope-types.cc b/compiler-rt/test/asan/TestCases/use-after-scope-types.cc new file mode 100644 index 0000000..0e47d07 --- /dev/null +++ b/compiler-rt/test/asan/TestCases/use-after-scope-types.cc @@ -0,0 +1,79 @@ +// RUN: %clangxx_asan -std=c++11 -O0 -fsanitize-address-use-after-scope %s -o %t +// RUN: export %env_asan_opts=detect_stack_use_after_scope=1 +// RUN: not %run %t 0 2>&1 | FileCheck %s +// RUN: not %run %t 1 2>&1 | FileCheck %s +// RUN: not %run %t 2 2>&1 | FileCheck %s +// RUN: not %run %t 3 2>&1 | FileCheck %s +// RUN: not %run %t 4 2>&1 | FileCheck %s +// RUN: not %run %t 5 2>&1 | FileCheck %s +// RUN: not %run %t 6 2>&1 | FileCheck %s +// RUN: not %run %t 7 2>&1 | FileCheck %s +// RUN: not %run %t 8 2>&1 | FileCheck %s +// RUN: not %run %t 9 2>&1 | FileCheck %s +// RUN: not %run %t 10 2>&1 | FileCheck %s +// RUN: not %run %t 11 2>&1 | FileCheck %s + +// RUN: %env_asan_opts=detect_stack_use_after_scope=0 %run %t 12 + +#include +#include +#include + +template struct Ptr { + void Store(T *ptr) { t = ptr; } + + void Access() { *t = {}; } + + T *t; +}; + +template struct Ptr { + using Type = T[N]; + void Store(Type *ptr) { t = *ptr; } + + void Access() { *t = {}; } + + T *t; +}; + +template void test() { + Ptr ptr; + { + T x; + ptr.Store(&x); + } + + ptr.Access(); + // CHECK: ERROR: AddressSanitizer: stack-use-after-scope + // CHECK: #{{[0-9]+}} 0x{{.*}} in void test{{.*}}(){{.*}}use-after-scope-types.cc:[[@LINE-2]] + // CHECK: Address 0x{{.*}} is located in stack of thread T{{.*}} at offset [[OFFSET:[^ ]+]] in frame + // {{\[}}[[OFFSET]], {{[0-9]+}}) 'x' +} + +int main(int argc, char **argv) { + using Tests = void (*)(); + Tests tests[] = { + &test, + &test, + &test, + &test, + &test, + &test, + &test, + &test>, + &test, + &test, + &test, + &test, + }; + + int n = atoi(argv[1]); + if (n == sizeof(tests) / sizeof(tests[0])) { + for (auto te : tests) + te(); + } else { + tests[n](); + } + + return 0; +} -- 2.7.4