17df30e77SMitch Phillips // Ensure that operator new/delete are still replaceable. 27df30e77SMitch Phillips 3*15689f3aSMitch Phillips // FIXME: Weak symbols aren't supported on Windows, although some code in 4*15689f3aSMitch Phillips // compiler-rt already exists to solve this problem. We should probably define 5*15689f3aSMitch Phillips // the new/delete interceptors as "weak" using those workarounds as well. 6*15689f3aSMitch Phillips // UNSUPPORTED: windows 7*15689f3aSMitch Phillips 87df30e77SMitch Phillips // RUN: %clangxx %s -o %t -fsanitize=address -shared-libsan && not %run %t 2>&1 | FileCheck %s 97df30e77SMitch Phillips // RUN: %clangxx %s -o %t -fsanitize=address -static-libsan && not %run %t 2>&1 | FileCheck %s 107df30e77SMitch Phillips 117df30e77SMitch Phillips #include <cstdio> 127df30e77SMitch Phillips #include <cstdlib> 137df30e77SMitch Phillips #include <new> 147df30e77SMitch Phillips operator new[](size_t size)157df30e77SMitch Phillipsvoid *operator new[](size_t size) { 167df30e77SMitch Phillips fprintf(stderr, "replaced new\n"); 177df30e77SMitch Phillips return malloc(size); 187df30e77SMitch Phillips } 197df30e77SMitch Phillips operator delete[](void * ptr)207df30e77SMitch Phillipsvoid operator delete[](void *ptr) noexcept { 217df30e77SMitch Phillips fprintf(stderr, "replaced delete\n"); 227df30e77SMitch Phillips return free(ptr); 237df30e77SMitch Phillips } 247df30e77SMitch Phillips main(int argc,char ** argv)257df30e77SMitch Phillipsint main(int argc, char **argv) { 267df30e77SMitch Phillips // CHECK: replaced new 277df30e77SMitch Phillips char *x = new char[5]; 287df30e77SMitch Phillips // CHECK: replaced delete 297df30e77SMitch Phillips delete[] x; 307df30e77SMitch Phillips // CHECK: ERROR: AddressSanitizer 317df30e77SMitch Phillips *x = 13; 327df30e77SMitch Phillips return 0; 337df30e77SMitch Phillips } 34