// RUN: %clangxx_asan -O %s -o %t && %t #include #include #include #include #include #include __attribute__((noinline)) void Throw() { int local; fprintf(stderr, "Throw: %p\n", &local); throw 1; } __attribute__((noinline)) void ThrowAndCatch() { int local; try { Throw(); } catch(...) { fprintf(stderr, "Catch: %p\n", &local); } } void TestThrow() { char x[32]; fprintf(stderr, "Before: %p poisoned: %d\n", &x, __asan_address_is_poisoned(x + 32)); ThrowAndCatch(); fprintf(stderr, "After: %p poisoned: %d\n", &x, __asan_address_is_poisoned(x + 32)); // FIXME: Invert this assertion once we fix // https://code.google.com/p/address-sanitizer/issues/detail?id=258 assert(!__asan_address_is_poisoned(x + 32)); } void TestThrowInline() { char x[32]; fprintf(stderr, "Before: %p poisoned: %d\n", &x, __asan_address_is_poisoned(x + 32)); try { Throw(); } catch(...) { fprintf(stderr, "Catch\n"); } fprintf(stderr, "After: %p poisoned: %d\n", &x, __asan_address_is_poisoned(x + 32)); // FIXME: Invert this assertion once we fix // https://code.google.com/p/address-sanitizer/issues/detail?id=258 assert(!__asan_address_is_poisoned(x + 32)); } static jmp_buf buf; void TestLongJmp() { char x[32]; fprintf(stderr, "\nTestLongJmp\n"); fprintf(stderr, "Before: %p poisoned: %d\n", &x, __asan_address_is_poisoned(x + 32)); if (0 == setjmp(buf)) longjmp(buf, 1); fprintf(stderr, "After: %p poisoned: %d\n", &x, __asan_address_is_poisoned(x + 32)); // FIXME: Invert this assertion once we fix // https://code.google.com/p/address-sanitizer/issues/detail?id=258 assert(!__asan_address_is_poisoned(x + 32)); } int main(int argc, char **argv) { TestThrow(); TestThrowInline(); TestLongJmp(); }