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))
14void Throw() {
15  int local;
16  fprintf(stderr, "Throw:  %p\n", &local);
17  throw 1;
18}
19
20__attribute__((noinline))
21void ThrowAndCatch() {
22  int local;
23  try {
24    Throw();
25  } catch(...) {
26    fprintf(stderr, "Catch:  %p\n", &local);
27  }
28}
29
30void 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
42void 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
58static jmp_buf buf;
59
60void 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
74int main(int argc, char **argv) {
75  TestThrow();
76  TestThrowInline();
77  TestLongJmp();
78}
79