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