1// RUN: %clangxx_asan %s -o %t && %t 2// http://code.google.com/p/address-sanitizer/issues/detail?id=147 (not fixed). 3// BROKEN: %clangxx_asan %s -o %t -static-libstdc++ && %t 4#include <stdio.h> 5static volatile int zero = 0; 6inline void pretend_to_do_something(void *x) { 7 __asm__ __volatile__("" : : "r" (x) : "memory"); 8} 9 10__attribute__((noinline, no_sanitize_address)) 11void ReallyThrow() { 12 fprintf(stderr, "ReallyThrow\n"); 13 if (zero == 0) 14 throw 42; 15} 16 17__attribute__((noinline)) 18void Throw() { 19 int a, b, c, d, e; 20 pretend_to_do_something(&a); 21 pretend_to_do_something(&b); 22 pretend_to_do_something(&c); 23 pretend_to_do_something(&d); 24 pretend_to_do_something(&e); 25 fprintf(stderr, "Throw stack = %p\n", &a); 26 ReallyThrow(); 27} 28 29__attribute__((noinline)) 30void CheckStack() { 31 int ar[100]; 32 pretend_to_do_something(ar); 33 for (int i = 0; i < 100; i++) 34 ar[i] = i; 35 fprintf(stderr, "CheckStack stack = %p, %p\n", ar, ar + 100); 36} 37 38int main(int argc, char** argv) { 39 try { 40 Throw(); 41 } catch(int a) { 42 fprintf(stderr, "a = %d\n", a); 43 } 44 CheckStack(); 45} 46