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

Reply via email to