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 Weber int 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