| /* PR middle-end/63272 - GCC should warn when using pointer to dead scoped |
| variable within the same function |
| Exercise -Wdangling-pointer for escaping stores of addreses of auto |
| variables. |
| { dg-do compile } |
| { dg-options "-O0 -Wall -ftrack-macro-expansion=0" } |
| { dg-require-effective-target alloca } */ |
| |
| void* alloca (__SIZE_TYPE__); |
| |
| void* sink (void*, ...); |
| |
| extern void *evp; |
| |
| void nowarn_store_extern_call (void) |
| { |
| int x; |
| evp = &x; |
| sink (0); |
| } |
| |
| void nowarn_store_extern_ovrwrite (void) |
| { |
| int x; |
| evp = &x; |
| evp = 0; |
| } |
| |
| void nowarn_store_extern_store (void) |
| { |
| int x; |
| void **p = (void**)sink (&evp); |
| evp = &x; |
| *p = 0; |
| } |
| |
| |
| void warn_store_alloca (int n) |
| { |
| // This fails because of a bug in the warning. |
| void *p = alloca (n); |
| evp = p; // { dg-warning "storing the address of local variable 'x' in 'evp1'" "pr??????" { xfail *-*-* } } |
| } |
| |
| |
| void warn_store_extern (void) |
| { |
| extern void *evp1; // { dg-message "'evp1' declared here" } |
| int x; // { dg-message "'x' declared here" } |
| evp1 = &x; // { dg-warning "storing the address of local variable 'x' in 'evp1'" } |
| } |
| |
| |
| void nowarn_store_arg_call (void **vpp) |
| { |
| int x; |
| *vpp = &x; |
| sink (0); |
| } |
| |
| void nowarn_store_arg_ovrwrite (void **vpp) |
| { |
| int x; |
| *vpp = &x; |
| *vpp = 0; |
| } |
| |
| void nowarn_store_arg_store (void **vpp) |
| { |
| int x; |
| void **p = (void**)sink (0); |
| *vpp = &x; |
| *p = 0; |
| } |
| |
| void* nowarn_store_arg_store_arg (void **vpp1, void **vpp2) |
| { |
| int x; |
| void **p = (void**)sink (0); |
| *vpp1 = &x; // warn here? |
| *vpp2 = 0; // might overwrite *vpp1 |
| return p; |
| } |
| |
| void warn_store_arg (void **vpp) |
| { |
| int x; // { dg-message "'x' declared here" } |
| *vpp = &x; // { dg-warning "storing the address of local variable 'x' in '\\*vpp'" } |
| } |
| |
| |