12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan %s -o %t && %run %t 2a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany// http://code.google.com/p/address-sanitizer/issues/detail?id=147 (not fixed). 32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// BROKEN: %clangxx_asan %s -o %t -static-libstdc++ && %run %t 42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// 52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// Android builds with static libstdc++ by default. 62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// XFAIL: android 72d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 85d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// Clang doesn't support exceptions on Windows yet. 95d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// XFAIL: win32 105d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines 11a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany#include <stdio.h> 12a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryanystatic volatile int zero = 0; 13a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryanyinline void pretend_to_do_something(void *x) { 14a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany __asm__ __volatile__("" : : "r" (x) : "memory"); 15a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany} 16a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany 1700b8a34250e9f6c1c0211c33f4fe4da15d0fb24aKostya Serebryany__attribute__((noinline, no_sanitize_address)) 18a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryanyvoid ReallyThrow() { 19a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany fprintf(stderr, "ReallyThrow\n"); 20a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany if (zero == 0) 21a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany throw 42; 22a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany} 23a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany 24a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany__attribute__((noinline)) 25a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryanyvoid Throw() { 26a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany int a, b, c, d, e; 27a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany pretend_to_do_something(&a); 28a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany pretend_to_do_something(&b); 29a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany pretend_to_do_something(&c); 30a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany pretend_to_do_something(&d); 31a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany pretend_to_do_something(&e); 32a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany fprintf(stderr, "Throw stack = %p\n", &a); 33a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany ReallyThrow(); 34a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany} 35a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany 36a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany__attribute__((noinline)) 37a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryanyvoid CheckStack() { 38a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany int ar[100]; 39a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany pretend_to_do_something(ar); 40a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany for (int i = 0; i < 100; i++) 41a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany ar[i] = i; 42a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany fprintf(stderr, "CheckStack stack = %p, %p\n", ar, ar + 100); 43a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany} 44a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany 45a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryanyint main(int argc, char** argv) { 46a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany try { 47a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany Throw(); 4869b109a665247d424874253b412fe9b5253d1702Evgeniy Stepanov } catch(int a) { 49a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany fprintf(stderr, "a = %d\n", a); 50a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany } 51a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany CheckStack(); 52a1b5c09e608933cb2a9edef1488f45f5a94c91a3Kostya Serebryany} 53