From d6eee817901823e3cdc7138f87d1dfd8675575e5 Mon Sep 17 00:00:00 2001 From: Vitaly Buka Date: Thu, 27 Oct 2016 21:02:32 +0000 Subject: [PATCH] [asan] Test jumps which bypass variables declaration Summary: Clang should not generate lifetime intrinsics for such variables. D24693 PR28267 Reviewers: eugenis Subscribers: llvm-commits, kubabrecka Differential Revision: https://reviews.llvm.org/D24696 llvm-svn: 285343 --- .../test/asan/TestCases/use-after-scope-goto.cc | 73 ++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 compiler-rt/test/asan/TestCases/use-after-scope-goto.cc diff --git a/compiler-rt/test/asan/TestCases/use-after-scope-goto.cc b/compiler-rt/test/asan/TestCases/use-after-scope-goto.cc new file mode 100644 index 0000000..351cbe9 --- /dev/null +++ b/compiler-rt/test/asan/TestCases/use-after-scope-goto.cc @@ -0,0 +1,73 @@ +// RUN: %clangxx_asan -O0 -fsanitize-address-use-after-scope %s -o %t && %run %t + +// Function jumps over variable initialization making lifetime analysis +// ambiguous. Asan should ignore such variable and program must not fail. + +#include + +int *ptr; + +void f1(int cond) { + if (cond) + goto label; + int tmp; + + label: + ptr = &tmp; + *ptr = 5; +} + +void f2(int cond) { + switch (cond) { + case 1: { + ++cond; + int tmp; + ptr = &tmp; + exit(0); + case 2: + ptr = &tmp; + *ptr = 5; + exit(0); + } + } +} + +void f3(int cond) { + { + int tmp; + goto l2; + l1: + ptr = &tmp; + *ptr = 5; + + exit(0); + } + l2: + goto l1; +} + +void use(int *x) { + static int c = 10; + if (--c == 0) + exit(0); + (*x)++; +} + +void f4() { + { + int x; + l2: + use(&x); + goto l1; + } + l1: + goto l2; +} + +int main() { + f1(1); + f2(1); + f3(1); + f4(); + return 0; +} -- 2.7.4