| // RUN: %clangxx_asan -xc++ -shared -fPIC -o %t.so - < %s |
| // RUN: %clang_asan %s -o %t.out -ldl |
| // |
| // RUN: { env ASAN_OPTIONS=verbosity=1 %t.out %t.so || : ; } 2>&1 | FileCheck %s |
| // |
| // CHECK: AddressSanitizer: failed to intercept '__cxa_throw' |
| // |
| // This tests assumes static linking of the asan runtime. |
| // UNSUPPORTED: asan-dynamic-runtime |
| |
| #ifdef __cplusplus |
| |
| static void foo(void) { |
| int i = 0; |
| throw(i); |
| } |
| |
| extern "C" { |
| int bar(void); |
| }; |
| int bar(void) { |
| try { |
| foo(); |
| } catch (int i) { |
| return i; |
| } |
| return -1; |
| } |
| |
| #else |
| |
| #include <assert.h> |
| #include <dlfcn.h> |
| |
| int main(int argc, char **argv) { |
| int (*bar)(void); |
| void *handle = dlopen(argv[1], RTLD_LAZY); |
| assert(handle); |
| bar = dlsym(handle, "bar"); |
| assert(bar); |
| return bar(); |
| } |
| |
| #endif |