| // RUN: %clangxx_scudo -fsized-deallocation %s -o %t |
| // RUN: %env_scudo_opts=DeleteSizeMismatch=1 %run %t gooddel 2>&1 |
| // RUN: %env_scudo_opts=DeleteSizeMismatch=1 not %run %t baddel 2>&1 | FileCheck %s |
| // RUN: %env_scudo_opts=DeleteSizeMismatch=0 %run %t baddel 2>&1 |
| // RUN: %env_scudo_opts=DeleteSizeMismatch=1 %run %t gooddelarr 2>&1 |
| // RUN: %env_scudo_opts=DeleteSizeMismatch=1 not %run %t baddelarr 2>&1 | FileCheck %s |
| // RUN: %env_scudo_opts=DeleteSizeMismatch=0 %run %t baddelarr 2>&1 |
| |
| // Ensures that the sized delete operator errors out when the appropriate |
| // option is passed and the sizes do not match between allocation and |
| // deallocation functions. |
| |
| #include <assert.h> |
| #include <stdlib.h> |
| #include <string.h> |
| |
| #include <new> |
| |
| int main(int argc, char **argv) { |
| assert(argc == 2); |
| if (!strcmp(argv[1], "gooddel")) { |
| long long *p = new long long; |
| operator delete(p, sizeof(long long)); |
| } |
| if (!strcmp(argv[1], "baddel")) { |
| long long *p = new long long; |
| operator delete(p, 2); |
| } |
| if (!strcmp(argv[1], "gooddelarr")) { |
| char *p = new char[64]; |
| operator delete[](p, 64); |
| } |
| if (!strcmp(argv[1], "baddelarr")) { |
| char *p = new char[63]; |
| operator delete[](p, 64); |
| } |
| return 0; |
| } |
| |
| // CHECK: ERROR: invalid sized delete when deallocating address |