// REQUIRES: asan-64-bits // RUN: %clangxx_asan -O3 %s -o %t // RUN: %env_asan_opts=poison_array_cookie=1 not %run %t 2>&1 | FileCheck %s --check-prefix=COOKIE // RUN: %env_asan_opts=poison_array_cookie=0 not %run %t 2>&1 | FileCheck %s --check-prefix=NO_COOKIE // UNSUPPORTED: ios #include #include #include int dtor_counter; struct C { int x; ~C() { dtor_counter++; fprintf(stderr, "DTOR %d\n", dtor_counter); } }; __attribute__((noinline)) void Delete(C *c) { delete[] c; } __attribute__((no_sanitize_address)) void Write42ToCookie(C *c) { long *p = reinterpret_cast(c); p[-1] = 42; } int main(int argc, char **argv) { C *buffer = new C[argc]; delete [] buffer; Write42ToCookie(buffer); delete [] buffer; // COOKIE: DTOR 1 // COOKIE-NOT: DTOR 2 // COOKIE: AddressSanitizer: loaded array cookie from free-d memory // COOKIE: AddressSanitizer: attempting double-free // NO_COOKIE: DTOR 1 // NO_COOKIE: DTOR 43 // NO_COOKIE-NOT: DTOR 44 // NO_COOKIE-NOT: AddressSanitizer: loaded array cookie from free-d memory // NO_COOKIE: AddressSanitizer: attempting double-free }