https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116221

anlauf at gcc dot gnu.org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |anlauf at gcc dot gnu.org

--- Comment #3 from anlauf at gcc dot gnu.org ---
(In reply to Sam James from comment #0)
> With an LTO bootstrap, I saw the following:
> ```
> /var/tmp/portage/sys-devel/gcc-15.0.9999/work/gcc-15.0.9999/gcc/fortran/
> symbol.cc: In function ‘gfc_get_ha_symbol’:
> /var/tmp/portage/sys-devel/gcc-15.0.9999/work/gcc-15.0.9999/gcc/fortran/
> symbol.cc:3606:7: warning: ‘st’ may be used uninitialized
> [-Wmaybe-uninitialized]
>  3606 |   if (st)
>       |       ^
> /var/tmp/portage/sys-devel/gcc-15.0.9999/work/gcc-15.0.9999/gcc/fortran/
> symbol.cc:3602:16: note: ‘st’ declared here
>  3602 |   gfc_symtree *st;
>       |                ^
> ```
> 
> At a glance, it looks like it might be right.
> 
> ```
> int
> gfc_get_ha_symbol (const char *name, gfc_symbol **result)
> {
>   int i;
>   gfc_symtree *st;
> 
>   i = gfc_get_ha_sym_tree (name, &st);
> 
>   if (st)
>     *result = st->n.sym;
>   else
>     *result = NULL;
> 
>   return i;
> }
> ```
> 
> We always test st after calling gfc_get_ha_sym_tree, but gfc_get_ha_sym_tree
> doesn't _always_ initialise st (result):
> 
> int
> gfc_get_ha_sym_tree (const char *name, gfc_symtree **result)
> {
>   gfc_symtree *st;
>   int i;
> 
>   i = gfc_find_sym_tree (name, gfc_current_ns, 0, &st);
> 
>   if (st != NULL)
>     {
>       gfc_save_symbol_data (st->n.sym);
>       *result = st;
>       return i;
>     }
> 
>   i = gfc_find_sym_tree (name, gfc_current_ns, 1, &st);
>   if (i)
>     return i;
> 
>   if (st != NULL)
>     {
>       *result = st;
>       return 0;
>     }
> 
>   return gfc_get_sym_tree (name, gfc_current_ns, result, false);
> }

I can imagine that it is difficult to prove that in gfc_get_ha_symbol
st always gets set before the test.  Does it help to initialize it?

diff --git a/gcc/fortran/symbol.cc b/gcc/fortran/symbol.cc
index b5143d9f790..a8b623dd92a 100644
--- a/gcc/fortran/symbol.cc
+++ b/gcc/fortran/symbol.cc
@@ -3599,7 +3599,7 @@ int
 gfc_get_ha_symbol (const char *name, gfc_symbol **result)
 {
   int i;
-  gfc_symtree *st;
+  gfc_symtree *st = NULL;

   i = gfc_get_ha_sym_tree (name, &st);

Reply via email to