1*f7c5c0d8SMitch Phillips // RUN: %clangxx_scudo -fsized-deallocation %s -o %t
2*f7c5c0d8SMitch Phillips // RUN: %env_scudo_opts=DeleteSizeMismatch=1     %run %t gooddel    2>&1
3*f7c5c0d8SMitch Phillips // RUN: %env_scudo_opts=DeleteSizeMismatch=1 not %run %t baddel     2>&1 | FileCheck %s
4*f7c5c0d8SMitch Phillips // RUN: %env_scudo_opts=DeleteSizeMismatch=0     %run %t baddel     2>&1
5*f7c5c0d8SMitch Phillips // RUN: %env_scudo_opts=DeleteSizeMismatch=1     %run %t gooddelarr 2>&1
6*f7c5c0d8SMitch Phillips // RUN: %env_scudo_opts=DeleteSizeMismatch=1 not %run %t baddelarr  2>&1 | FileCheck %s
7*f7c5c0d8SMitch Phillips // RUN: %env_scudo_opts=DeleteSizeMismatch=0     %run %t baddelarr  2>&1
8*f7c5c0d8SMitch Phillips 
9*f7c5c0d8SMitch Phillips // Ensures that the sized delete operator errors out when the appropriate
10*f7c5c0d8SMitch Phillips // option is passed and the sizes do not match between allocation and
11*f7c5c0d8SMitch Phillips // deallocation functions.
12*f7c5c0d8SMitch Phillips 
13*f7c5c0d8SMitch Phillips #include <assert.h>
14*f7c5c0d8SMitch Phillips #include <stdlib.h>
15*f7c5c0d8SMitch Phillips #include <string.h>
16*f7c5c0d8SMitch Phillips 
17*f7c5c0d8SMitch Phillips #include <new>
18*f7c5c0d8SMitch Phillips 
main(int argc,char ** argv)19*f7c5c0d8SMitch Phillips int main(int argc, char **argv) {
20*f7c5c0d8SMitch Phillips   assert(argc == 2);
21*f7c5c0d8SMitch Phillips   if (!strcmp(argv[1], "gooddel")) {
22*f7c5c0d8SMitch Phillips     long long *p = new long long;
23*f7c5c0d8SMitch Phillips     operator delete(p, sizeof(long long));
24*f7c5c0d8SMitch Phillips   }
25*f7c5c0d8SMitch Phillips   if (!strcmp(argv[1], "baddel")) {
26*f7c5c0d8SMitch Phillips     long long *p = new long long;
27*f7c5c0d8SMitch Phillips     operator delete(p, 2);
28*f7c5c0d8SMitch Phillips   }
29*f7c5c0d8SMitch Phillips   if (!strcmp(argv[1], "gooddelarr")) {
30*f7c5c0d8SMitch Phillips     char *p = new char[64];
31*f7c5c0d8SMitch Phillips     operator delete[](p, 64);
32*f7c5c0d8SMitch Phillips   }
33*f7c5c0d8SMitch Phillips   if (!strcmp(argv[1], "baddelarr")) {
34*f7c5c0d8SMitch Phillips     char *p = new char[63];
35*f7c5c0d8SMitch Phillips     operator delete[](p, 64);
36*f7c5c0d8SMitch Phillips   }
37*f7c5c0d8SMitch Phillips   return 0;
38*f7c5c0d8SMitch Phillips }
39*f7c5c0d8SMitch Phillips 
40*f7c5c0d8SMitch Phillips // CHECK: ERROR: invalid sized delete when deallocating address
41