On Tue, Apr 28, 2020 at 08:27:12PM +0200, Stefan Schulze Frielinghaus wrote: > On Tue, Apr 28, 2020 at 11:33:31AM +0200, Richard Biener wrote: > > On Tue, Apr 28, 2020 at 10:03 AM Stefan Schulze Frielinghaus via > > Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > > > > > In function handle_vector_size_attribute local variable nunits is > > > supposed to be initialized by function type_valid_for_vector_size. > > > However, in case ARGS is null the function may return with a non-null > > > value and leave nunits uninitialized. This results in warning/error: > > > > > > gcc/poly-int.h: In function 'tree_node* > > > handle_vector_size_attribute(tree_node**, tree, tree, int, bool*)': > > > gcc/poly-int.h:330:3: error: 'nunits' may be used uninitialized in this > > > function [-Werror=maybe-uninitialized] > > > 330 | ((void) (&(RES).coeffs[0] == (C *) 0), \ > > > | ^ > > > gcc/c-family/c-attribs.c:3695:26: note: 'nunits' was declared here > > > 3695 | unsigned HOST_WIDE_INT nunits; > > > | > > > > > > This is fixed by also checking whether ARGS is null or not. > > > > > > Bootstrapped and regtested on S/390. Ok for master? > > > > I think it's better to assert that it is not null for example by adding a > > nonnull attribute? Can you check if that works? If it doesn't the > > patch is OK. > > Yes, that works, too. Please find an updated version attached. If you > think it is useful I could also add a gcc_assert (!args) for minimal > testing.
I guess initializing nunits to zero does not really solve the problem and while failing to identify all call sides (which isn't future-proof anyway), I went with adding a checking assert statement. Bootstrapped and regtested on S/390. Ok for master?
>From e07fe025a710de80cade4ae5c6e4351fbd21b672 Mon Sep 17 00:00:00 2001 From: Stefan Schulze Frielinghaus <stefa...@linux.ibm.com> Date: Sun, 26 Apr 2020 09:42:29 +0200 Subject: [PATCH] c-attribs.c: Fix warning about use of uninitialized variable nunits In function handle_vector_size_attribute local variable nunits is supposed to be initialized by function type_valid_for_vector_size. However, in case ARGS is null the function may return with a non-null value and leave nunits uninitialized. This results in warning/error: gcc/poly-int.h: In function 'tree_node* handle_vector_size_attribute(tree_node**, tree, tree, int, bool*)': gcc/poly-int.h:330:3: error: 'nunits' may be used uninitialized in this function [-Werror=maybe-uninitialized] 330 | ((void) (&(RES).coeffs[0] == (C *) 0), \ | ^ gcc/c-family/c-attribs.c:3695:26: note: 'nunits' was declared here 3695 | unsigned HOST_WIDE_INT nunits; | Added attribute nonnull for argument args in order to silence warning and added an assert statement in order to check the invariant candidate. gcc/c-family/ChangeLog: 2020-05-04 Stefan Schulze Frielinghaus <stefa...@linux.ibm.com> * c-attribs.c (handle_vector_size_attribute): Add attribute nonnull for argument args in order to silence warning of uninitialized variable usage and add assert statement in order to check for invariant candidate. --- gcc/c-family/c-attribs.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gcc/c-family/c-attribs.c b/gcc/c-family/c-attribs.c index ac936d5bbbb..dafc77cbcb7 100644 --- a/gcc/c-family/c-attribs.c +++ b/gcc/c-family/c-attribs.c @@ -117,7 +117,7 @@ static tree handle_tm_attribute (tree *, tree, tree, int, bool *); static tree handle_tm_wrap_attribute (tree *, tree, tree, int, bool *); static tree handle_novops_attribute (tree *, tree, tree, int, bool *); static tree handle_vector_size_attribute (tree *, tree, tree, int, - bool *); + bool *) ATTRIBUTE_NONNULL(3); static tree handle_nonnull_attribute (tree *, tree, tree, int, bool *); static tree handle_nonstring_attribute (tree *, tree, tree, int, bool *); static tree handle_nothrow_attribute (tree *, tree, tree, int, bool *); @@ -3697,6 +3697,8 @@ handle_vector_size_attribute (tree *node, tree name, tree args, if (!type) return NULL_TREE; + gcc_checking_assert (args != NULL); + tree new_type = build_vector_type (type, nunits); /* Build back pointers if needed. */ -- 2.25.3