]>
Commit | Line | Data |
---|---|---|
92a42be0 SL |
1 | // Clang doesn't support exceptions on Windows yet, so for the time being we |
2 | // build this program in two parts: the code with exceptions is built with CL, | |
3 | // the rest is built with Clang. This represents the typical scenario when we | |
4 | // build a large project using "clang-cl -fallback -fsanitize=address". | |
5 | // | |
6 | // RUN: cl -c %s -Fo%t.obj | |
7 | // RUN: %clangxx_asan -o %t.exe %s %t.obj | |
8 | // RUN: %run %t.exe | |
9 | ||
10 | #include <assert.h> | |
11 | #include <stdio.h> | |
12 | ||
13 | // Should just "#include <sanitizer/asan_interface.h>" when C++ exceptions are | |
14 | // supported and we don't need to use CL. | |
15 | extern "C" bool __asan_address_is_poisoned(void *p); | |
16 | ||
17 | void ThrowAndCatch(); | |
18 | void TestThrowInline(); | |
19 | ||
20 | #if !defined(__clang__) | |
21 | __declspec(noinline) | |
22 | void Throw() { | |
23 | int local; | |
24 | fprintf(stderr, "Throw: %p\n", &local); | |
25 | throw 1; | |
26 | } | |
27 | ||
28 | __declspec(noinline) | |
29 | void ThrowAndCatch() { | |
30 | int local; | |
31 | try { | |
32 | Throw(); | |
33 | } catch(...) { | |
34 | fprintf(stderr, "Catch: %p\n", &local); | |
35 | } | |
36 | } | |
37 | ||
38 | void TestThrowInline() { | |
39 | char x[32]; | |
40 | fprintf(stderr, "Before: %p poisoned: %d\n", &x, | |
41 | __asan_address_is_poisoned(x + 32)); | |
42 | try { | |
43 | Throw(); | |
44 | } catch(...) { | |
45 | fprintf(stderr, "Catch\n"); | |
46 | } | |
47 | fprintf(stderr, "After: %p poisoned: %d\n", &x, | |
48 | __asan_address_is_poisoned(x + 32)); | |
49 | // FIXME: Invert this assertion once we fix | |
50 | // https://code.google.com/p/address-sanitizer/issues/detail?id=258 | |
51 | assert(!__asan_address_is_poisoned(x + 32)); | |
52 | } | |
53 | ||
54 | #else | |
55 | ||
56 | void TestThrow() { | |
57 | char x[32]; | |
58 | fprintf(stderr, "Before: %p poisoned: %d\n", &x, | |
59 | __asan_address_is_poisoned(x + 32)); | |
60 | assert(__asan_address_is_poisoned(x + 32)); | |
61 | ThrowAndCatch(); | |
62 | fprintf(stderr, "After: %p poisoned: %d\n", &x, | |
63 | __asan_address_is_poisoned(x + 32)); | |
64 | // FIXME: Invert this assertion once we fix | |
65 | // https://code.google.com/p/address-sanitizer/issues/detail?id=258 | |
66 | assert(!__asan_address_is_poisoned(x + 32)); | |
67 | } | |
68 | ||
69 | int main(int argc, char **argv) { | |
70 | TestThrowInline(); | |
71 | TestThrow(); | |
72 | } | |
73 | #endif |