[PATCH] matchexp.c: Fix possible false positive of uninitialized variable usage e

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

[PATCH] matchexp.c: Fix possible false positive of uninitialized variable usage e

gcc - fortran mailing list
While bootstrapping GCC on S/390 the following warning is raised:

gcc/fortran/matchexp.c: In function 'match match_level_5(gfc_expr**)':
gcc/fortran/matchexp.c:401:18: error: 'e' may be used uninitialized in this function [-Werror=maybe-uninitialized]
  401 |    gfc_free_expr (e);
      |    ~~~~~~~~~~~~~~^~~
/home/stefansf/devel/gcc/src/gcc/fortran/matchexp.c:353:19: note: 'e' was declared here
  353 |   gfc_expr *all, *e, *total;
      |                   ^

In function match_add_operand local variable e gets initialised via
function match_ext_mult_operand if it returns MATCH_YES.  In case of the
remaining two return values MATCH_NO and MATCH_ERROR the current
function call is terminated before e may be used.  Thus this
warning/error seems to be a false positive analogous to variable e in
function match_mult_operand.  Interestingly this warning may be silenced
by initialising variable e of either function match_level_5 or
match_add_operand.  Since both variables are unrelated and correspond to
different functions, this endorses the suspicion of a false positive.

Silenced the warning by initializing variable e of function
match_add_operand.

Bootstrapped and regtested on S/390.  Ok for master?

gcc/fortran/ChangeLog:

2020-05-04  Stefan Schulze Frielinghaus  <[hidden email]>

        * matchexp.c (match_add_operand): Initialize local variable e.
---
 gcc/fortran/matchexp.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/gcc/fortran/matchexp.c b/gcc/fortran/matchexp.c
index 6479582d75b..25e675f3d45 100644
--- a/gcc/fortran/matchexp.c
+++ b/gcc/fortran/matchexp.c
@@ -348,7 +348,9 @@ match_ext_mult_operand (gfc_expr **result)
 static match
 match_add_operand (gfc_expr **result)
 {
-  gfc_expr *all, *e, *total;
+  /* Workaround -Wmaybe-uninitialized false positive by initializing variable
+     e.  */
+  gfc_expr *all, *e = NULL, *total;
   locus where, old_loc;
   match m;
   gfc_intrinsic_op i;
--
2.25.3

Reply | Threaded
Open this post in threaded view
|

[PATCH, FORTRAN] matchexp.c: Fix possible false positive of uninitialized variable usage e

gcc - fortran mailing list
While bootstrapping GCC on S/390 the following warning is raised:

gcc/fortran/matchexp.c: In function 'match match_level_5(gfc_expr**)':
gcc/fortran/matchexp.c:401:18: error: 'e' may be used uninitialized in this function [-Werror=maybe-uninitialized]
  401 |    gfc_free_expr (e);
      |    ~~~~~~~~~~~~~~^~~
/home/stefansf/devel/gcc/src/gcc/fortran/matchexp.c:353:19: note: 'e' was declared here
  353 |   gfc_expr *all, *e, *total;
      |                   ^

In function match_add_operand local variable e gets initialised via
function match_ext_mult_operand if it returns MATCH_YES.  In case of the
remaining two return values MATCH_NO and MATCH_ERROR the current
function call is terminated before e may be used.  Thus this
warning/error seems to be a false positive analogous to variable e in
function match_mult_operand.  Interestingly this warning may be silenced
by initialising variable e of either function match_level_5 or
match_add_operand.  Since both variables are unrelated and correspond to
different functions, this endorses the suspicion of a false positive.

Silenced the warning by initializing variable e of function
match_add_operand.

Bootstrapped and regtested on S/390.  Ok for master?

gcc/fortran/ChangeLog:

2020-05-04  Stefan Schulze Frielinghaus  <[hidden email]>

        * matchexp.c (match_add_operand): Initialize local variable e.
---
 gcc/fortran/matchexp.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/gcc/fortran/matchexp.c b/gcc/fortran/matchexp.c
index 6479582d75b..25e675f3d45 100644
--- a/gcc/fortran/matchexp.c
+++ b/gcc/fortran/matchexp.c
@@ -348,7 +348,9 @@ match_ext_mult_operand (gfc_expr **result)
 static match
 match_add_operand (gfc_expr **result)
 {
-  gfc_expr *all, *e, *total;
+  /* Workaround -Wmaybe-uninitialized false positive by initializing variable
+     e.  */
+  gfc_expr *all, *e = NULL, *total;
   locus where, old_loc;
   match m;
   gfc_intrinsic_op i;
--
2.25.3