1*7df30e77SMitch Phillips // Ensure that operator new/delete are still replaceable. 2*7df30e77SMitch Phillips 3*7df30e77SMitch Phillips // RUN: %clangxx %s -o %t -fsanitize=address -shared-libsan && not %run %t 2>&1 | FileCheck %s 4*7df30e77SMitch Phillips // RUN: %clangxx %s -o %t -fsanitize=address -static-libsan && not %run %t 2>&1 | FileCheck %s 5*7df30e77SMitch Phillips 6*7df30e77SMitch Phillips #include <cstdio> 7*7df30e77SMitch Phillips #include <cstdlib> 8*7df30e77SMitch Phillips #include <new> 9*7df30e77SMitch Phillips 10*7df30e77SMitch Phillips void *operator new[](size_t size) { 11*7df30e77SMitch Phillips fprintf(stderr, "replaced new\n"); 12*7df30e77SMitch Phillips return malloc(size); 13*7df30e77SMitch Phillips } 14*7df30e77SMitch Phillips 15*7df30e77SMitch Phillips void operator delete[](void *ptr) noexcept { 16*7df30e77SMitch Phillips fprintf(stderr, "replaced delete\n"); 17*7df30e77SMitch Phillips return free(ptr); 18*7df30e77SMitch Phillips } 19*7df30e77SMitch Phillips 20*7df30e77SMitch Phillips int main(int argc, char **argv) { 21*7df30e77SMitch Phillips // CHECK: replaced new 22*7df30e77SMitch Phillips char *x = new char[5]; 23*7df30e77SMitch Phillips // CHECK: replaced delete 24*7df30e77SMitch Phillips delete[] x; 25*7df30e77SMitch Phillips // CHECK: ERROR: AddressSanitizer 26*7df30e77SMitch Phillips *x = 13; 27*7df30e77SMitch Phillips return 0; 28*7df30e77SMitch Phillips } 29