]>
git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/testsuite/c-c++-common/Wuse-after-free-5.c
1 /* Verify -Wuse-after-free=2 triggers for conditional as well as
2 unconditional uses but not for equality expressions.
4 { dg-options "-O0 -Wall -Wuse-after-free=2" } */
8 # define EXTERN_C extern "C"
10 # define EXTERN_C extern
13 EXTERN_C
void free (void*);
18 void warn_double_free (void *p
)
21 free (p
); // { dg-warning "pointer 'p' used" }
24 void warn_cond_double_free (void *p
, int c
)
28 free (p
); // { dg-warning "pointer 'p' may be used" }
31 void warn_call_after_free (void *p
)
34 sink (p
); // { dg-warning "pointer 'p' used" }
37 void warn_cond_call_after_free (void *p
, int c
)
41 sink (p
); // { dg-warning "pointer 'p' may be used" }
44 void* warn_return_after_free (void *p
)
47 return p
; // { dg-warning "pointer 'p' used" }
50 void* warn_cond_return_after_free (void *p
, int c
)
54 return p
; // { dg-warning "pointer 'p' may be used" }
58 void warn_relational_after_free (char *p
, char *q
[])
64 p
< q
[0], // { dg-warning "pointer 'p' used" }
65 p
<= q
[1], // { dg-warning "pointer 'p' used" }
66 p
> q
[2], // { dg-warning "pointer 'p' used" }
67 p
>= q
[3], // { dg-warning "pointer 'p' used" }
75 void warn_cond_relational_after_free (char *p
, char *q
[], int c
)
81 c
? p
< q
[0] : q
[0][0], // { dg-warning "pointer 'p' may be used" }
82 c
? p
<= q
[1] : q
[1][1], // { dg-warning "pointer 'p' may be used" }
83 c
? p
> q
[2] : q
[2][2], // { dg-warning "pointer 'p' may be used" }
84 c
? p
>= q
[3] : q
[3][3], // { dg-warning "pointer 'p' may be used" }
85 c
? p
== q
[4] : q
[4][4],
86 c
? p
!= q
[5] : q
[5][5],
93 // Verify warning for the example in the manual.
95 struct A
{ int refcount
; void *data
; };
97 void release (struct A
*p
)
99 int refcount
= --p
->refcount
;
102 free (p
->data
); // { dg-warning "pointer 'p' may be used" }