1 /* PR ????? - No warning on attempts to access free object
2 Verify that attempting to reallocate unallocated objects referenced
3 either directly or through pointers is diagnosed.
5 { dg-options "-O2 -Wall -Wfree-nonheap-object" }
6 { dg-require-effective-target alloca } */
8 typedef __SIZE_TYPE__
size_t;
10 extern void free (void*);
11 extern void* alloca (size_t);
12 extern void* realloc (void*, size_t);
14 void sink (void*, ...);
22 void nowarn_realloc (void *p
, size_t n
)
24 char *q
= realloc (p
, n
);
30 q
= realloc (q
, n
* 2);
34 /* Verify that calling realloc on a pointer to an unknown object minus
35 some nonzero offset isn't diagnosed, but a pointer plus a positive
36 offset is (a positive offset cannot point at the beginning). */
38 void test_realloc_offset (char *p1
, char *p2
, char *p3
, size_t n
, int i
)
41 q
= realloc (p1
- 1, n
);
44 q
= realloc (p2
+ 1, n
); // { dg-warning "'realloc' called on pointer 'p2' with nonzero offset 1" }
47 q
= realloc (p3
+ i
, n
);
51 void warn_realloc_extern_arr (void)
53 extern char ecarr
[]; // { gg-message "declared here" }
55 char *q
= realloc (p
, n
); // { dg-warning "'realloc' called on unallocated object 'ecarr'" }
59 void warn_realloc_extern_arr_offset (int i
)
63 char *q
= realloc (p
, n
); // { dg-warning "\\\[-Wfree-nonheap-object" }
68 void warn_realloc_string (int i
)
74 q
= realloc (p
, n
); // { dg-warning "\\\[-Wfree-nonheap-object" }
80 q
= realloc (p
, n
); // { dg-warning "\\\[-Wfree-nonheap-object" }
86 q
= realloc (p
, n
); // { dg-warning "\\\[-Wfree-nonheap-object" }
92 void warn_realloc_alloca (int n
, int i
)
98 q
= realloc (p
, n
); // { dg-warning "\\\[-Wfree-nonheap-object" }
102 p
= (char*)alloca (n
+ 1);
104 q
= realloc (p
, n
); // { dg-warning "\\\[-Wfree-nonheap-object" }
108 p
= (char*)alloca (n
+ 2) + i
;
110 q
= realloc (p
, n
); // { dg-warning "\\\[-Wfree-nonheap-object" }
116 void warn_realloc_local_arr (int i
)
122 q
= realloc (a
, n
); // { dg-warning "\\\[-Wfree-nonheap-object" }
129 q
= realloc (b
+ 1, n
); // { dg-warning "\\\[-Wfree-nonheap-object" }
136 q
= realloc (&c
[2], n
); // { dg-warning "\\\[-Wfree-nonheap-object" }
143 q
= realloc (&d
[i
], n
); // { dg-warning "\\\[-Wfree-nonheap-object" }
148 void warn_realloc_vla (int n1
, int n2
, int i
)
154 q
= realloc (vla
, n2
); // { dg-warning "\\\[-Wfree-nonheap-object" }
161 q
= realloc (vlb
+ 1, n2
);// { dg-warning "\\\[-Wfree-nonheap-object" }
168 q
= realloc (&vlc
[2], n2
);// { dg-warning "\\\[-Wfree-nonheap-object" }
175 q
= realloc (&vld
[i
], n2
);// { dg-warning "\\\[-Wfree-nonheap-object" }
180 void nowarn_realloc_extern_ptrarr (void)
182 char *q
= realloc (*eparr
, n
);
186 void nowarn_realloc_extern_ptrarr_offset (int i
)
189 char *q
= realloc (p
, n
);
194 void warn_realloc_extern_ptrarr (void)
196 char *q
= realloc (eparr
, n
); // { dg-warning "\\\[-Wfree-nonheap-object" }
200 void warn_realloc_extern_ptrarr_offset (int i
)
203 void *q
= realloc (p
, n
); // { dg-warning "\\\[-Wfree-nonheap-object" }
208 void nowarn_realloc_extern_ptr (void)
210 char *q
= realloc (eptr
, n
);
214 void nowarn_realloc_extern_ptr_offset (int i
)
217 char *q
= realloc (p
, n
);
222 void warn_realloc_extern_ptr_pos_offset (int i
)
228 char *q
= realloc (p
, n
); // { dg-warning "\\\[-Wfree-nonheap-object" }
233 void nowarn_realloc_parm_offset (char *p
, int i
)
240 void nowarn_realloc_parm_neg_offset (char *p
, int i
)
250 void warn_realloc_parm_pos_offset (char *p
, int i
)
256 q
= realloc (q
, n
); // { dg-warning "\\\[-Wfree-nonheap-object" }
260 void nowarn_realloc_deref_parm_pos_offset (void **p
, int i
)
265 // The offset is from p, not *p.
271 void warn_realloc_deref_parm_pos_offset (void **p
, int i
)
276 // Unlike in the function above the offset is from *p.
278 q
= realloc (q
, n
); // { dg-warning "\\\[-Wfree-nonheap-object" }