diff options
author | Martin Sebor <msebor@redhat.com> | 2019-11-01 21:09:20 +0000 |
---|---|---|
committer | Martin Sebor <msebor@gcc.gnu.org> | 2019-11-01 15:09:20 -0600 |
commit | 49fb45c81f4ac068d9fb859968d8f223bc438251 (patch) | |
tree | 56f91e1dcae71841b97747d2342eacce4c35592e /gcc/testsuite/gcc.dg/Wzero-length-array-bounds.c | |
parent | 8dc56a2244cfe35cbdb53e0f586c16f90a2677e4 (diff) | |
download | gcc-49fb45c81f4ac068d9fb859968d8f223bc438251.zip gcc-49fb45c81f4ac068d9fb859968d8f223bc438251.tar.gz gcc-49fb45c81f4ac068d9fb859968d8f223bc438251.tar.bz2 |
PR middle-end/91679 - missing -Warray-bounds accessing a member array in a local buffer
PR middle-end/91679 - missing -Warray-bounds accessing a member array in a local buffer
PR middle-end/91647 - new FAILs for Warray-bounds-8 and Wstringop-overflow-3.C
PR middle-end/91463 - missing -Warray-bounds accessing past the end of a statically initialized flexible array member
PR middle-end/92312 - bogus -Wstringop-overflow storing into a trailing array backed by larger buffer
gcc/ChangeLog:
PR middle-end/91679
PR middle-end/91647
PR middle-end/91463
PR middle-end/92312
* c-family/c-pretty-print.c (direct_abstract_declarator): Print
bound in zero-length arrays.
* gcc/c-family/c.opt (-Wzero-length-bounds): New option.
* gcc/doc/invoke.texi (-Wzero-length-bounds): Document.
* gimple-match-head.c (try_conditional_simplification): Use memcpy
instead of a hand-rolled loop to avoid PR 92323.
* tree-vrp.c (vrp_prop::check_array_ref): Handle trailing arrays
with initializers.
(vrp_prop::check_mem_ref): Handle declared struct objects.
* tree.c (last_field): New function.
(array_at_struct_end_p): Handle MEM_REF.
(get_initializer_for): New helper.
(component_ref_size): Add argument. Rename locals. Call
get_initializer_for instead of fold_ctor_reference. Correct handling
of flexible array members.
* wide-int.h (generic_wide_int <storage>::sign_mask): Assert invariant.
gcc/testsuite/ChangeLog:
PR middle-end/91679
PR middle-end/91647
PR middle-end/91463
PR middle-end/92312
* c-c++-common/Warray-bounds-2.c: Disable VRP. Adjust expected messages.
* g++.dg/warn/Warray-bounds-8.C: Remove xfails.
* gcc.dg/Warray-bounds-48.c: New test.
* gcc.dg/Warray-bounds-49.c: New test.
* gcc.dg/Wstringop-overflow-16.c: Adjust text of expected messages.
* gcc.dg/Wstringop-overflow-21.c: New test.
* gcc.dg/Wzero-length-array-bounds.c: New test.
* gcc.dg/pr36902.c: Remove xfail.
* gcc.dg/strlenopt-57.c: Add an expected warning.
From-SVN: r277728
Diffstat (limited to 'gcc/testsuite/gcc.dg/Wzero-length-array-bounds.c')
-rw-r--r-- | gcc/testsuite/gcc.dg/Wzero-length-array-bounds.c | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/Wzero-length-array-bounds.c b/gcc/testsuite/gcc.dg/Wzero-length-array-bounds.c new file mode 100644 index 0000000..8e880d9 --- /dev/null +++ b/gcc/testsuite/gcc.dg/Wzero-length-array-bounds.c @@ -0,0 +1,88 @@ +/* PR middle-end/91647 - missing -Warray-bounds accessing a zero-length array + of a declared object + Test to exercise -Wzero-length-bounds. + { dg-do compile } + { dg-options "-O2 -Wall" } */ + +void sink (void*); + +struct X { int a[0]; int b, c; }; + +extern struct X x; + +void bad (int i, int j) +{ + x.a[0] = 0; // { dg-warning "\\\[-Wzero-length-bounds" } + x.a[1] = 1; // { dg-warning "\\\[-Wzero-length-bounds" } + x.a[2] = 2; // { dg-warning "\\\[-Warray-bounds" } + + x.a[i] = 3; // { dg-warning "\\\[-Wzero-length-bounds" } + x.a[j] = 4; // { dg-warning "array subscript 'j' is outside the bounds of an interior zero-length array" } +} + +void access_by_reference (struct X *p, int i) +{ + p->a[0] = 0; // { dg-warning "\\\[-Wzero-length-bounds" } + p->a[1] = 0; // { dg-warning "\\\[-Wzero-length-bounds" } + p->a[2] = 0; // { dg-warning "\\\[-Wzero-length-bounds" } + p->a[i] = 0; // { dg-warning "\\\[-Wzero-length-bounds" } +} + + +extern struct X a[2]; + +void access_to_array (int i) +{ + a[0].a[0] = 0; // { dg-warning "\\\[-Wzero-length-bounds" } + a[0].a[1] = 1; // { dg-warning "\\\[-Wzero-length-bounds" } + /* Accesses to a subsequent element of the enclosing array seem like + a more sever problem than those to the next member of the same + struct and so might perhaps be better diagnosed by -Warray-bounds. + Then again, code that does this sort of crap might as well get what + it deserves if it disables -Wzero-length-bounds. */ + a[0].a[2] = 2; // { dg-warning "\\\[-Wzero-length-bounds" } + + a[0].a[i] = 3; // { dg-warning "\\\[-Wzero-length-bounds" } + sink (a); + + a[1].a[0] = 4; // { dg-warning "\\\[-Wzero-length-bounds" } + a[1].a[1] = 5; // { dg-warning "\\\[-Wzero-length-bounds" } + a[1].a[2] = 6; // { dg-warning "\\\[-Warray-bounds" } + + a[1].a[i] = 7; // { dg-warning "\\\[-Wzero-length-bounds" } + sink (a); + + a[i].a[0] = 8; // { dg-warning "\\\[-Wzero-length-bounds" } + a[i].a[1] = 9; // { dg-warning "\\\[-Wzero-length-bounds" } + a[i].a[2] = 0; // { dg-warning "\\\[-Wzero-length-bounds" } +} + + +struct Y +{ + struct X a[2], b; + int c; +}; + +extern struct Y y; + +void access_to_member (int i) +{ + y.a[0].a[0] = 0; // { dg-warning "\\\[-Wzero-length-bounds" } + y.a[0].a[1] = 0; // { dg-warning "\\\[-Wzero-length-bounds" } + y.a[0].a[2] = 0; // { dg-warning "\\\[-Wzero-length-bounds" } + sink (a); + + y.a[1].a[0] = 0; // { dg-warning "\\\[-Wzero-length-bounds" } + y.a[1].a[1] = 0; // { dg-warning "\\\[-Wzero-length-bounds" } + /* Similar to the array case above, accesses to a subsequent member + of the "parent" struct seem like a more severe problem than those + to the next member of the same struct. */ + y.a[1].a[2] = 0; // { dg-warning "\\\[-Wzero-length-bounds" } + sink (a); + + y.b.a[0] = 0; // { dg-warning "\\\[-Wzero-length-bounds" } + y.b.a[1] = 0; // { dg-warning "\\\[-Wzero-length-bounds" } + y.b.a[2] = 0; // { dg-warning "\\\[-Wzero-length-bounds" } + y.b.a[3] = 0; // { dg-warning "\\\[-Warray-bounds" } +} |