]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/testsuite/g++.dg/warn/Wuse-after-free.C
Add -Wuse-after-free [PR80532].
[thirdparty/gcc.git] / gcc / testsuite / g++.dg / warn / Wuse-after-free.C
1 /* Exercise basic C++ only cases of -Wuse-after-free without optimization.
2 { dg-do compile }
3 { dg-options "-O0 -Wall" } */
4
5 typedef __SIZE_TYPE__ size_t;
6
7 extern "C" void free (void *);
8 extern "C" void* realloc (void *, size_t);
9
10 void sink (void *);
11
12 extern void* evp;
13 extern void* evpa[];
14
15 extern int ei;
16
17 struct List { struct List *next; };
18
19 void nowarn_delete (void *vp, struct List *lp)
20 {
21 {
22 operator delete (vp);
23 vp = 0;
24 sink (vp);
25 }
26 {
27 operator delete (evp);
28 evp = 0;
29 sink (evp);
30 }
31 {
32 operator delete (evpa[0]);
33 evpa[0] = 0;
34 sink (evpa[0]);
35 }
36 {
37 void *vp = evpa[0];
38 operator delete (evpa[0]);
39 sink (vp);
40 }
41 {
42 void *p = evpa[1];
43 if (ei & 1)
44 operator delete (p);
45 if (ei & 2)
46 sink (p);
47 }
48 {
49 struct List *next = lp->next;
50 operator delete (lp);
51 operator delete (next);
52 }
53 }
54
55 void nowarn_delete_arg (void *p, void *q)
56 {
57 operator delete (p);
58 if (q)
59 operator delete (q);
60 }
61
62 void nowarn_delete_extern (void)
63 {
64 extern void *ep, *eq;
65 operator delete (ep);
66 ep = eq;
67 operator delete (ep);
68 }
69
70 void nowarn_delete_assign (void)
71 {
72 extern void *ep;
73 operator delete (ep);
74 ep = 0;
75 operator delete (ep);
76 }
77
78 void warn_double_delete_arg (void *p)
79 {
80 operator delete (p); // { dg-message "call to 'void operator delete\\(void\\*\\)'" "note" }
81 operator delete (p); // { dg-warning "\\\-Wuse-after-free" }
82 }
83
84 void warn_delete_free_arg (void *p)
85 {
86 operator delete (p); // { dg-message "call to 'void operator delete\\(void\\*\\)'" "note" }
87 free (p); // { dg-warning "\\\-Wuse-after-free" }
88 }
89
90 void warn_free_delete_arg (void *p)
91 {
92 free (p); // { dg-message "call to 'void free\\(void\\*\\)'" "note" }
93 operator delete (p); // { dg-warning "\\\-Wuse-after-free" }
94 }
95
96 void warn_mismatched_double_delete_arg (void *p, void *q)
97 {
98 operator delete (p); // { dg-message "call to 'void operator delete\\(void\\*\\)'" "note" }
99 operator delete[] (p); // { dg-warning "\\\-Wuse-after-free" }
100
101 operator delete[] (q); // { dg-message "call to 'void operator delete \\\[]\\(void\\*\\)'" "note" }
102 operator delete (q); // { dg-warning "\\\-Wuse-after-free" }
103 }
104
105 void warn_double_delete_extern (void)
106 {
107 /* GCC assumes operator delete() clobbers global memory and the warning is
108 too simplistic to see through that assumption. */
109 extern void *ep, *eq;
110 {
111 eq = ep;
112 operator delete (ep); // { dg-message "call to 'operator delete'" "pr??????" { xfail *-*-* } }
113 operator delete (eq); // { dg-warning "\\\-Wuse-after-free" "pr??????" { xfail *-*-* } }
114 }
115 }
116
117 void warn_deref_after_delete (int *p, int i)
118 {
119 int *q0 = p, *q1 = p + 1, *qi = p + i;
120 operator delete (p); // { dg-message "call to 'void operator delete\\(void\\*\\)'" "note" }
121 *p = 0; // { dg-warning "\\\-Wuse-after-free" }
122
123 *q0 = 0; // { dg-warning "\\\-Wuse-after-free" }
124 *q1 = 0; // { dg-warning "\\\-Wuse-after-free" }
125 *qi = 0; // { dg-warning "\\\-Wuse-after-free" }
126 }
127
128 void warn_array_ref_after_delete (int *p, int i)
129 {
130 operator delete (p); // { dg-message "call to 'void operator delete\\(void\\*\\)'" "note" }
131 p[i] = 0; // { dg-warning "\\\-Wuse-after-free" }
132 }
133
134 void nowarn_delete_list (struct List *head)
135 {
136 for (struct List *p = head, *q; p; p = q)
137 {
138 q = p->next;
139 operator delete (p);
140 }
141 }
142
143 void warn_delete_list (struct List *head)
144 {
145 struct List *p = head;
146 for (; p; p = p->next) // { dg-warning "\\\[-Wuse-after-free" }
147 operator delete (p); // { dg-message "call to 'void operator delete\\(void\\*\\)'" "note" }
148 }
149
150 void warn_delete (void *vp)
151 {
152 {
153 operator delete (vp); // { dg-message "call to 'void operator delete\\(void\\*\\)'" "note" }
154 evp = vp; // { dg-warning "-Wuse-after-free" }
155 evpa[0] = vp; // { dg-warning "-Wuse-after-free" }
156 evpa[1] = evp;
157 }
158 }