16d1862363c88c183b0ed7740fca876342cf0474bStephen Hines// Clang doesn't support SEH on Windows yet, so for the time being we 26d1862363c88c183b0ed7740fca876342cf0474bStephen Hines// build this program in two parts: the code with SEH is built with CL, 36d1862363c88c183b0ed7740fca876342cf0474bStephen Hines// the rest is built with Clang. This represents the typical scenario when we 46d1862363c88c183b0ed7740fca876342cf0474bStephen Hines// build a large project using "clang-cl -fallback -fsanitize=address". 56d1862363c88c183b0ed7740fca876342cf0474bStephen Hines// 66d1862363c88c183b0ed7740fca876342cf0474bStephen Hines// Check both -GS and -GS- builds: 76d1862363c88c183b0ed7740fca876342cf0474bStephen Hines// RUN: cl -c %s -Fo%t.obj 86d1862363c88c183b0ed7740fca876342cf0474bStephen Hines// RUN: %clangxx_asan -o %t.exe %s %t.obj 96d1862363c88c183b0ed7740fca876342cf0474bStephen Hines// RUN: %run %t.exe 106d1862363c88c183b0ed7740fca876342cf0474bStephen Hines// 116d1862363c88c183b0ed7740fca876342cf0474bStephen Hines// RUN: cl -GS- -c %s -Fo%t.obj 126d1862363c88c183b0ed7740fca876342cf0474bStephen Hines// RUN: %clangxx_asan -o %t.exe %s %t.obj 136d1862363c88c183b0ed7740fca876342cf0474bStephen Hines// RUN: %run %t.exe 146d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 156d1862363c88c183b0ed7740fca876342cf0474bStephen Hines#include <windows.h> 166d1862363c88c183b0ed7740fca876342cf0474bStephen Hines#include <assert.h> 176d1862363c88c183b0ed7740fca876342cf0474bStephen Hines#include <stdio.h> 186d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 196d1862363c88c183b0ed7740fca876342cf0474bStephen Hines// Should just "#include <sanitizer/asan_interface.h>" when C++ exceptions are 206d1862363c88c183b0ed7740fca876342cf0474bStephen Hines// supported and we don't need to use CL. 216d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesextern "C" bool __asan_address_is_poisoned(void *p); 226d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 236d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesvoid ThrowAndCatch(); 246d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 256d1862363c88c183b0ed7740fca876342cf0474bStephen Hines#if !defined(__clang__) 266d1862363c88c183b0ed7740fca876342cf0474bStephen Hines__declspec(noinline) 276d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesvoid Throw() { 286d1862363c88c183b0ed7740fca876342cf0474bStephen Hines int local, zero = 0; 296d1862363c88c183b0ed7740fca876342cf0474bStephen Hines fprintf(stderr, "Throw: %p\n", &local); 306d1862363c88c183b0ed7740fca876342cf0474bStephen Hines local = 5 / zero; 316d1862363c88c183b0ed7740fca876342cf0474bStephen Hines} 326d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 336d1862363c88c183b0ed7740fca876342cf0474bStephen Hines__declspec(noinline) 346d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesvoid ThrowAndCatch() { 356d1862363c88c183b0ed7740fca876342cf0474bStephen Hines int local; 366d1862363c88c183b0ed7740fca876342cf0474bStephen Hines __try { 376d1862363c88c183b0ed7740fca876342cf0474bStephen Hines Throw(); 386d1862363c88c183b0ed7740fca876342cf0474bStephen Hines } __except(EXCEPTION_EXECUTE_HANDLER) { 396d1862363c88c183b0ed7740fca876342cf0474bStephen Hines fprintf(stderr, "__except: %p\n", &local); 406d1862363c88c183b0ed7740fca876342cf0474bStephen Hines } 416d1862363c88c183b0ed7740fca876342cf0474bStephen Hines} 426d1862363c88c183b0ed7740fca876342cf0474bStephen Hines#else 436d1862363c88c183b0ed7740fca876342cf0474bStephen Hines 446d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesint main() { 456d1862363c88c183b0ed7740fca876342cf0474bStephen Hines char x[32]; 466d1862363c88c183b0ed7740fca876342cf0474bStephen Hines fprintf(stderr, "Before: %p poisoned: %d\n", &x, 476d1862363c88c183b0ed7740fca876342cf0474bStephen Hines __asan_address_is_poisoned(x + 32)); 486d1862363c88c183b0ed7740fca876342cf0474bStephen Hines assert(__asan_address_is_poisoned(x + 32)); 496d1862363c88c183b0ed7740fca876342cf0474bStephen Hines ThrowAndCatch(); 506d1862363c88c183b0ed7740fca876342cf0474bStephen Hines fprintf(stderr, "After: %p poisoned: %d\n", &x, 516d1862363c88c183b0ed7740fca876342cf0474bStephen Hines __asan_address_is_poisoned(x + 32)); 526d1862363c88c183b0ed7740fca876342cf0474bStephen Hines // FIXME: Invert this assertion once we fix 536d1862363c88c183b0ed7740fca876342cf0474bStephen Hines // https://code.google.com/p/address-sanitizer/issues/detail?id=258 546d1862363c88c183b0ed7740fca876342cf0474bStephen Hines assert(!__asan_address_is_poisoned(x + 32)); 556d1862363c88c183b0ed7740fca876342cf0474bStephen Hines} 566d1862363c88c183b0ed7740fca876342cf0474bStephen Hines#endif 57