189de457bd3ec40d38bc7860f88f1d4da473eacc4Kostya Serebryany// Test that use-after-return works with exceptions. 2799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// RUN: %clangxx_asan -O0 %s -o %t 3799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// RUN: %env_asan_opts=detect_stack_use_after_return=1 %run %t 489de457bd3ec40d38bc7860f88f1d4da473eacc4Kostya Serebryany 589de457bd3ec40d38bc7860f88f1d4da473eacc4Kostya Serebryany#include <stdio.h> 689de457bd3ec40d38bc7860f88f1d4da473eacc4Kostya Serebryany 789de457bd3ec40d38bc7860f88f1d4da473eacc4Kostya Serebryanyvolatile char *g; 889de457bd3ec40d38bc7860f88f1d4da473eacc4Kostya Serebryany 9b1173c27c2791aef27304e68911a11648401064dKostya Serebryany#ifndef FRAME_SIZE 10b1173c27c2791aef27304e68911a11648401064dKostya Serebryany# define FRAME_SIZE 100 11b1173c27c2791aef27304e68911a11648401064dKostya Serebryany#endif 12b1173c27c2791aef27304e68911a11648401064dKostya Serebryany 13b1173c27c2791aef27304e68911a11648401064dKostya Serebryany#ifndef NUM_ITER 14b1173c27c2791aef27304e68911a11648401064dKostya Serebryany# define NUM_ITER 4000 15b1173c27c2791aef27304e68911a11648401064dKostya Serebryany#endif 16b1173c27c2791aef27304e68911a11648401064dKostya Serebryany 17b1173c27c2791aef27304e68911a11648401064dKostya Serebryany#ifndef DO_THROW 18b1173c27c2791aef27304e68911a11648401064dKostya Serebryany# define DO_THROW 1 19b1173c27c2791aef27304e68911a11648401064dKostya Serebryany#endif 20b1173c27c2791aef27304e68911a11648401064dKostya Serebryany 2189de457bd3ec40d38bc7860f88f1d4da473eacc4Kostya Serebryanyvoid Func(int depth) { 22b1173c27c2791aef27304e68911a11648401064dKostya Serebryany char frame[FRAME_SIZE]; 2389de457bd3ec40d38bc7860f88f1d4da473eacc4Kostya Serebryany g = &frame[0]; 2489de457bd3ec40d38bc7860f88f1d4da473eacc4Kostya Serebryany if (depth) 2589de457bd3ec40d38bc7860f88f1d4da473eacc4Kostya Serebryany Func(depth - 1); 26b1173c27c2791aef27304e68911a11648401064dKostya Serebryany else if (DO_THROW) 2789de457bd3ec40d38bc7860f88f1d4da473eacc4Kostya Serebryany throw 1; 2889de457bd3ec40d38bc7860f88f1d4da473eacc4Kostya Serebryany} 2989de457bd3ec40d38bc7860f88f1d4da473eacc4Kostya Serebryany 3089de457bd3ec40d38bc7860f88f1d4da473eacc4Kostya Serebryanyint main(int argc, char **argv) { 31b1173c27c2791aef27304e68911a11648401064dKostya Serebryany for (int i = 0; i < NUM_ITER; i++) { 3289de457bd3ec40d38bc7860f88f1d4da473eacc4Kostya Serebryany try { 3389de457bd3ec40d38bc7860f88f1d4da473eacc4Kostya Serebryany Func(argc * 100); 3489de457bd3ec40d38bc7860f88f1d4da473eacc4Kostya Serebryany } catch(...) { 3589de457bd3ec40d38bc7860f88f1d4da473eacc4Kostya Serebryany } 36b1173c27c2791aef27304e68911a11648401064dKostya Serebryany if ((i % (NUM_ITER / 10)) == 0) 3789de457bd3ec40d38bc7860f88f1d4da473eacc4Kostya Serebryany fprintf(stderr, "done [%d]\n", i); 3889de457bd3ec40d38bc7860f88f1d4da473eacc4Kostya Serebryany } 3989de457bd3ec40d38bc7860f88f1d4da473eacc4Kostya Serebryany return 0; 4089de457bd3ec40d38bc7860f88f1d4da473eacc4Kostya Serebryany} 41