| /* PR middle-end/10138 - warn for uninitialized arrays passed as const* |
| arguments |
| Verify that passing pointers to uninitialized objects to arguments |
| to functions declared with attribute access is diagnosed where expected. |
| { dg-do compile } |
| { dg-options "-O -Wall" } */ |
| |
| #define RO(...) __attribute__ ((access (read_only, __VA_ARGS__))) |
| #define RW(...) __attribute__ ((access (read_write, __VA_ARGS__))) |
| #define WO(...) __attribute__ ((access (write_only, __VA_ARGS__))) |
| |
| RO (1) void fpri (int*); // { dg-message "in a call to 'fpri' declared with attribute 'access \\\(read_only, 1\\\)' here" } |
| |
| RO (1) void fpcri (const int*); |
| |
| RO (1, 2) void fpcri1_2 (const int*, int); |
| |
| |
| void warn_scalar_fpri (void) |
| { |
| int i; // { dg-message "declared here" } |
| fpri (&i); // { dg-warning "'i' is used uninitialized" } |
| } |
| |
| void nowarn_scalar_plus_fpri (void) |
| { |
| int i; |
| /* This gets a -Wstringop-overflow for reading past the end but not |
| -Wuninitialized because there's nothing to initialize there. */ |
| fpri (&i + 1); // { dg-warning "\\\[-Wstringop-overread" } |
| } |
| |
| void nowarn_array_assign_fpcri (void) |
| { |
| int a[2]; |
| a[0] = 0; |
| fpcri (a); |
| } |
| |
| void nowarn_array_init_fpcri (void) |
| { |
| int a[4] = { 0 }; |
| fpcri (a); |
| } |
| |
| void nowarn_array_compound_fpri (void) |
| { |
| fpri ((int[2]){ 0 }); |
| } |
| |
| void nowarn_array_compound_fpcri (void) |
| { |
| fpcri ((int[3]){ 1 }); |
| } |
| |
| void warn_scalar_fpcri (void) |
| { |
| int i; |
| fpcri (&i); // { dg-warning "\\\[-Wuninitialized" } |
| } |
| |
| void warn_array_fpcri (void) |
| { |
| int a[4]; |
| fpcri (a); // { dg-warning "\\\[-Wuninitialized" } |
| } |
| |
| void warn_array_plus_cst_fpcri (void) |
| { |
| int a[4]; |
| fpcri (a + 1); // { dg-warning "\\\[-Wuninitialized" } |
| } |
| |
| void warn_array_plus_var_fpcri (int i) |
| { |
| int a[4]; |
| fpcri (a + i); // { dg-warning "\\\[-Wuninitialized" } |
| } |
| |
| void nowarn_struct_assign_fpcri (void) |
| { |
| struct { int a, b; } s; |
| s.a = 0; |
| fpcri (&s.a); |
| } |
| |
| void warn_struct_assign_fpcri (void) |
| { |
| struct { int a, b; } s; |
| s.a = 0; |
| fpcri (&s.b); // { dg-warning "\\\[-Wuninitialized" } |
| } |
| |
| void nowarn_struct_init_fpcri (void) |
| { |
| struct { int a, b; } s = { 0 }; |
| fpcri (&s.a); |
| fpcri (&s.b); |
| } |
| |
| void nowarn_struct_compound_fpcri (void) |
| { |
| struct S { int a, b; }; |
| fpcri (&(struct S){ }.a); |
| fpcri (&(struct S){ }.b); |
| } |
| |
| |
| void nowarn_scalar_fpcri1_2 (void) |
| { |
| int i; |
| fpcri1_2 (&i, 0); |
| } |
| |
| void nowarn_array_assign_fpcri1_2 (void) |
| { |
| int a[2]; |
| a[0] = 0; |
| fpcri1_2 (a, 1); |
| } |
| |
| void nowarn_array_assign_fpcri1_2_plus_cst (void) |
| { |
| int a[3]; |
| a[1] = 0; |
| fpcri1_2 (a + 1, 1); |
| } |
| |
| void nowarn_array_init_fpcri1_2 (void) |
| { |
| int a[4] = { 0 }; |
| fpcri1_2 (a, 2); |
| } |
| |
| void warn_array_fpcri1_2_rd1 (void) |
| { |
| int a[4]; |
| fpcri1_2 (a, 1); // { dg-warning "\\\[-Wuninitialized" } |
| } |
| |
| void warn_array_fpcri1_2_rd2 (void) |
| { |
| int a[4]; |
| fpcri1_2 (a, 2); // { dg-warning "\\\[-Wuninitialized" } |
| } |