| // RUN: %clangxx_asan %s -o %t && %t |
| // RUN: %clangxx_asan %s -o %t -static-libstdc++ && %t |
| #include <stdio.h> |
| static volatile int zero = 0; |
| inline void pretend_to_do_something(void *x) { |
| __asm__ __volatile__("" : : "r" (x) : "memory"); |
| } |
| |
| __attribute__((noinline)) |
| void ReallyThrow() { |
| fprintf(stderr, "ReallyThrow\n"); |
| try { |
| if (zero == 0) |
| throw 42; |
| else if (zero == 1) |
| throw 1.; |
| } catch(double x) { |
| } |
| } |
| |
| __attribute__((noinline)) |
| void Throw() { |
| int a, b, c, d, e; |
| pretend_to_do_something(&a); |
| pretend_to_do_something(&b); |
| pretend_to_do_something(&c); |
| pretend_to_do_something(&d); |
| pretend_to_do_something(&e); |
| fprintf(stderr, "Throw stack = %p\n", &a); |
| ReallyThrow(); |
| } |
| |
| __attribute__((noinline)) |
| void CheckStack() { |
| int ar[100]; |
| pretend_to_do_something(ar); |
| for (int i = 0; i < 100; i++) |
| ar[i] = i; |
| fprintf(stderr, "CheckStack stack = %p, %p\n", ar, ar + 100); |
| } |
| |
| int main(int argc, char** argv) { |
| try { |
| Throw(); |
| } catch(int a) { |
| fprintf(stderr, "a = %d\n", a); |
| } |
| CheckStack(); |
| } |
| |