Index: test/asan/TestCases/use-after-scope-goto.cc =================================================================== --- /dev/null +++ test/asan/TestCases/use-after-scope-goto.cc @@ -0,0 +1,87 @@ +// RUN: %clangxx_asan -O0 -fsanitize-address-use-after-scope %s -o %t +// RUN: %run %t 1 +// RUN: %run %t 2 +// RUN: %run %t 3 +// RUN: %run %t 4 + +// 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(int argc, char **argv) { + if (argc != 2) + return 1; + switch (atoi(argv[1])) { + case 1: + f1(1); break; + case 2: + f2(1); break; + case 3: + f3(1); break; + case 4: + f4(); break; + default: + return 1; + } + return 0; +}