1*673dc3d4SNico Weber // REQUIRES: asan-64-bits 2*673dc3d4SNico Weber // RUN: %clangxx_asan -O3 %s -o %t 3*673dc3d4SNico Weber // RUN: %env_asan_opts=poison_array_cookie=1 not %run %t 2>&1 | FileCheck %s --check-prefix=COOKIE 4*673dc3d4SNico Weber // RUN: %env_asan_opts=poison_array_cookie=0 not %run %t 2>&1 | FileCheck %s --check-prefix=NO_COOKIE 5*673dc3d4SNico Weber 6*673dc3d4SNico Weber // UNSUPPORTED: ios 7*673dc3d4SNico Weber 8*673dc3d4SNico Weber #include <stdio.h> 9*673dc3d4SNico Weber #include <stdlib.h> 10*673dc3d4SNico Weber #include <assert.h> 11*673dc3d4SNico Weber int dtor_counter; 12*673dc3d4SNico Weber struct C { 13*673dc3d4SNico Weber int x; ~CC14*673dc3d4SNico Weber ~C() { 15*673dc3d4SNico Weber dtor_counter++; 16*673dc3d4SNico Weber fprintf(stderr, "DTOR %d\n", dtor_counter); 17*673dc3d4SNico Weber } 18*673dc3d4SNico Weber }; 19*673dc3d4SNico Weber Delete(C * c)20*673dc3d4SNico Weber__attribute__((noinline)) void Delete(C *c) { delete[] c; } Write42ToCookie(C * c)21*673dc3d4SNico Weber__attribute__((no_sanitize_address)) void Write42ToCookie(C *c) { 22*673dc3d4SNico Weber long *p = reinterpret_cast<long*>(c); 23*673dc3d4SNico Weber p[-1] = 42; 24*673dc3d4SNico Weber } 25*673dc3d4SNico Weber main(int argc,char ** argv)26*673dc3d4SNico Weberint main(int argc, char **argv) { 27*673dc3d4SNico Weber C *buffer = new C[argc]; 28*673dc3d4SNico Weber delete [] buffer; 29*673dc3d4SNico Weber Write42ToCookie(buffer); 30*673dc3d4SNico Weber delete [] buffer; 31*673dc3d4SNico Weber // COOKIE: DTOR 1 32*673dc3d4SNico Weber // COOKIE-NOT: DTOR 2 33*673dc3d4SNico Weber // COOKIE: AddressSanitizer: loaded array cookie from free-d memory 34*673dc3d4SNico Weber // COOKIE: AddressSanitizer: attempting double-free 35*673dc3d4SNico Weber // NO_COOKIE: DTOR 1 36*673dc3d4SNico Weber // NO_COOKIE: DTOR 43 37*673dc3d4SNico Weber // NO_COOKIE-NOT: DTOR 44 38*673dc3d4SNico Weber // NO_COOKIE-NOT: AddressSanitizer: loaded array cookie from free-d memory 39*673dc3d4SNico Weber // NO_COOKIE: AddressSanitizer: attempting double-free 40*673dc3d4SNico Weber 41*673dc3d4SNico Weber } 42