Home | History | Annotate | Download | only in TestCases
      1 // RUN: %clangxx_asan -O %s -o %t && %run %t
      2 
      3 // Clang doesn't support exceptions on Windows yet.
      4 // XFAIL: win32
      5 
      6 #include <assert.h>
      7 #include <stdio.h>
      8 #include <sanitizer/asan_interface.h>
      9 
     10 __attribute__((noinline))
     11 void Throw() {
     12   int local;
     13   fprintf(stderr, "Throw:  %p\n", &local);
     14   throw 1;
     15 }
     16 
     17 __attribute__((noinline))
     18 void ThrowAndCatch() {
     19   int local;
     20   try {
     21     Throw();
     22   } catch(...) {
     23     fprintf(stderr, "Catch:  %p\n", &local);
     24   }
     25 }
     26 
     27 void TestThrow() {
     28   char x[32];
     29   fprintf(stderr, "Before: %p poisoned: %d\n", &x,
     30           __asan_address_is_poisoned(x + 32));
     31   assert(__asan_address_is_poisoned(x + 32));
     32   ThrowAndCatch();
     33   fprintf(stderr, "After:  %p poisoned: %d\n",  &x,
     34           __asan_address_is_poisoned(x + 32));
     35   // FIXME: Invert this assertion once we fix
     36   // https://code.google.com/p/address-sanitizer/issues/detail?id=258
     37   // This assertion works only w/o UAR.
     38   if (!__asan_get_current_fake_stack())
     39     assert(!__asan_address_is_poisoned(x + 32));
     40 }
     41 
     42 void TestThrowInline() {
     43   char x[32];
     44   fprintf(stderr, "Before: %p poisoned: %d\n", &x,
     45           __asan_address_is_poisoned(x + 32));
     46   assert(__asan_address_is_poisoned(x + 32));
     47   try {
     48     Throw();
     49   } catch(...) {
     50     fprintf(stderr, "Catch\n");
     51   }
     52   fprintf(stderr, "After:  %p poisoned: %d\n",  &x,
     53           __asan_address_is_poisoned(x + 32));
     54   // FIXME: Invert this assertion once we fix
     55   // https://code.google.com/p/address-sanitizer/issues/detail?id=258
     56   // This assertion works only w/o UAR.
     57   if (!__asan_get_current_fake_stack())
     58     assert(!__asan_address_is_poisoned(x + 32));
     59 }
     60 
     61 int main(int argc, char **argv) {
     62   TestThrowInline();
     63   TestThrow();
     64 }
     65