xref: /aosp_15_r20/external/compiler-rt/test/scudo/double-free.cpp (revision 7c3d14c8b49c529e04be81a3ce6f5cc23712e4c6)
1*7c3d14c8STreehugger Robot // RUN: %clang_scudo %s -o %t
2*7c3d14c8STreehugger Robot // RUN: not %run %t malloc   2>&1 | FileCheck %s
3*7c3d14c8STreehugger Robot // RUN: not %run %t new      2>&1 | FileCheck %s
4*7c3d14c8STreehugger Robot // RUN: not %run %t newarray 2>&1 | FileCheck %s
5*7c3d14c8STreehugger Robot // RUN: not %run %t memalign 2>&1 | FileCheck %s
6*7c3d14c8STreehugger Robot 
7*7c3d14c8STreehugger Robot // Tests double-free error on pointers allocated with different allocation
8*7c3d14c8STreehugger Robot // functions.
9*7c3d14c8STreehugger Robot 
10*7c3d14c8STreehugger Robot #include <assert.h>
11*7c3d14c8STreehugger Robot #include <stdlib.h>
12*7c3d14c8STreehugger Robot #include <string.h>
13*7c3d14c8STreehugger Robot 
main(int argc,char ** argv)14*7c3d14c8STreehugger Robot int main(int argc, char **argv)
15*7c3d14c8STreehugger Robot {
16*7c3d14c8STreehugger Robot   assert(argc == 2);
17*7c3d14c8STreehugger Robot   if (!strcmp(argv[1], "malloc")) {
18*7c3d14c8STreehugger Robot     void *p = malloc(sizeof(int));
19*7c3d14c8STreehugger Robot     if (!p)
20*7c3d14c8STreehugger Robot       return 1;
21*7c3d14c8STreehugger Robot     free(p);
22*7c3d14c8STreehugger Robot     free(p);
23*7c3d14c8STreehugger Robot   }
24*7c3d14c8STreehugger Robot   if (!strcmp(argv[1], "new")) {
25*7c3d14c8STreehugger Robot     int *p = new int;
26*7c3d14c8STreehugger Robot     if (!p)
27*7c3d14c8STreehugger Robot       return 1;
28*7c3d14c8STreehugger Robot     delete p;
29*7c3d14c8STreehugger Robot     delete p;
30*7c3d14c8STreehugger Robot   }
31*7c3d14c8STreehugger Robot   if (!strcmp(argv[1], "newarray")) {
32*7c3d14c8STreehugger Robot     int *p = new int[8];
33*7c3d14c8STreehugger Robot     if (!p)
34*7c3d14c8STreehugger Robot       return 1;
35*7c3d14c8STreehugger Robot     delete[] p;
36*7c3d14c8STreehugger Robot     delete[] p;
37*7c3d14c8STreehugger Robot   }
38*7c3d14c8STreehugger Robot   if (!strcmp(argv[1], "memalign")) {
39*7c3d14c8STreehugger Robot     void *p = nullptr;
40*7c3d14c8STreehugger Robot     posix_memalign(&p, 0x100, sizeof(int));
41*7c3d14c8STreehugger Robot     if (!p)
42*7c3d14c8STreehugger Robot       return 1;
43*7c3d14c8STreehugger Robot     free(p);
44*7c3d14c8STreehugger Robot     free(p);
45*7c3d14c8STreehugger Robot   }
46*7c3d14c8STreehugger Robot   return 0;
47*7c3d14c8STreehugger Robot }
48*7c3d14c8STreehugger Robot 
49*7c3d14c8STreehugger Robot // CHECK: ERROR: invalid chunk state when deallocating address
50