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 <setjmp.h>
      8 #include <stdlib.h>
      9 #include <stdio.h>
     10 #include <string.h>
     11 #include <sanitizer/asan_interface.h>
     12 
     13 __attribute__((noinline))
     14 void Throw() {
     15   int local;
     16   fprintf(stderr, "Throw:  %p\n", &local);
     17   throw 1;
     18 }
     19 
     20 __attribute__((noinline))
     21 void ThrowAndCatch() {
     22   int local;
     23   try {
     24     Throw();
     25   } catch(...) {
     26     fprintf(stderr, "Catch:  %p\n", &local);
     27   }
     28 }
     29 
     30 void TestThrow() {
     31   char x[32];
     32   fprintf(stderr, "Before: %p poisoned: %d\n", &x,
     33           __asan_address_is_poisoned(x + 32));
     34   ThrowAndCatch();
     35   fprintf(stderr, "After:  %p poisoned: %d\n",  &x,
     36           __asan_address_is_poisoned(x + 32));
     37   // FIXME: Invert this assertion once we fix
     38   // https://code.google.com/p/address-sanitizer/issues/detail?id=258
     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   try {
     47     Throw();
     48   } catch(...) {
     49     fprintf(stderr, "Catch\n");
     50   }
     51   fprintf(stderr, "After:  %p poisoned: %d\n",  &x,
     52           __asan_address_is_poisoned(x + 32));
     53   // FIXME: Invert this assertion once we fix
     54   // https://code.google.com/p/address-sanitizer/issues/detail?id=258
     55   assert(!__asan_address_is_poisoned(x + 32));
     56 }
     57 
     58 static jmp_buf buf;
     59 
     60 void TestLongJmp() {
     61   char x[32];
     62   fprintf(stderr, "\nTestLongJmp\n");
     63   fprintf(stderr, "Before: %p poisoned: %d\n", &x,
     64           __asan_address_is_poisoned(x + 32));
     65   if (0 == setjmp(buf))
     66     longjmp(buf, 1);
     67   fprintf(stderr, "After:  %p poisoned: %d\n",  &x,
     68           __asan_address_is_poisoned(x + 32));
     69   // FIXME: Invert this assertion once we fix
     70   // https://code.google.com/p/address-sanitizer/issues/detail?id=258
     71   assert(!__asan_address_is_poisoned(x + 32));
     72 }
     73 
     74 int main(int argc, char **argv) {
     75   TestThrow();
     76   TestThrowInline();
     77   TestLongJmp();
     78 }
     79