1 // Test that use-after-return works with exceptions. 2 // RUN: %clangxx_asan -O0 %s -o %t 3 // RUN: %env_asan_opts=detect_stack_use_after_return=1 %run %t 4 5 #include <stdio.h> 6 7 volatile char *g; 8 9 #ifndef FRAME_SIZE 10 # define FRAME_SIZE 100 11 #endif 12 13 #ifndef NUM_ITER 14 # define NUM_ITER 4000 15 #endif 16 17 #ifndef DO_THROW 18 # define DO_THROW 1 19 #endif 20 Func(int depth)21void Func(int depth) { 22 char frame[FRAME_SIZE]; 23 g = &frame[0]; 24 if (depth) 25 Func(depth - 1); 26 else if (DO_THROW) 27 throw 1; 28 } 29 main(int argc,char ** argv)30int main(int argc, char **argv) { 31 for (int i = 0; i < NUM_ITER; i++) { 32 try { 33 Func(argc * 100); 34 } catch(...) { 35 } 36 if ((i % (NUM_ITER / 10)) == 0) 37 fprintf(stderr, "done [%d]\n", i); 38 } 39 return 0; 40 } 41