From 49fb45c81f4ac068d9fb859968d8f223bc438251 Mon Sep 17 00:00:00 2001 From: Martin Sebor Date: Fri, 1 Nov 2019 21:09:20 +0000 Subject: 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 ::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 --- gcc/wide-int.h | 2 ++ 1 file changed, 2 insertions(+) (limited to 'gcc/wide-int.h') diff --git a/gcc/wide-int.h b/gcc/wide-int.h index 862079a..5e0f444f 100644 --- a/gcc/wide-int.h +++ b/gcc/wide-int.h @@ -852,6 +852,8 @@ inline HOST_WIDE_INT generic_wide_int ::sign_mask () const { unsigned int len = this->get_len (); + gcc_assert (len > 0); + unsigned HOST_WIDE_INT high = this->get_val ()[len - 1]; if (!is_sign_extended) { -- cgit v1.1