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