[PATCH, PR94769] fortran/io.c: Fix use of uninitialized variable num

Stefan Schulze Frielinghaus stefansf@linux.ibm.com
Tue Apr 28 11:53:07 GMT 2020


While bootstrapping GCC on S/390 the following warning occurs:

gcc/fortran/io.c: In function 'bool gfc_resolve_dt(gfc_code*, gfc_dt*, locus*)':
gcc/fortran/io.c:3857:7: error: 'num' may be used uninitialized in this function [-Werror=maybe-uninitialized]
 3857 |       if (num == 0)
      |       ^~
gcc/fortran/io.c:3843:11: note: 'num' was declared here
 3843 |       int num;

Since gfc_resolve_dt is a non-static function we cannot assume anything about
argument DT.  Argument DT gets passed to function check_io_constraints which
passes values depending on DT, namely dt->asynchronous->value.character.string
to function compare_to_allowed_values as well as argument warn which is true as
soon as DT->dterr is true.  Thus both arguments depend on DT.

If function compare_to_allowed_values is called with
dt->asynchronous->value.character.string not being an allowed value, and
ALLOWED_F2003 as well as ALLOWED_GNU being NULL (which is the case at the
particular call side), and WARN equals true, then the function returns with a
non-zero value and leaves num uninitialized which renders the warning true.

Initializing num to any value but zero mimics the behavior of an uninitialized
variable except UB because zero is the only value it is tested for at the
moment.  Since num is used as an index into array asynchronous initializing it
to 2 seems plausible.

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

gcc/fortran/ChangeLog:

2020-04-28  Stefan Schulze Frielinghaus  <stefansf@linux.ibm.com>

        PR fortran/94769
        * io.c (check_io_constraints): Initialize local variable num.
---
 gcc/fortran/io.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/gcc/fortran/io.c b/gcc/fortran/io.c
index e066666e01d..4526f729d1d 100644
--- a/gcc/fortran/io.c
+++ b/gcc/fortran/io.c
@@ -3840,7 +3840,7 @@ if (condition) \
 
   if (dt->asynchronous)
     {
-      int num;
+      int num = 2;
       static const char * asynchronous[] = { "YES", "NO", NULL };
 
       /* Note: gfc_reduce_init_expr reports an error if not init-expr.  */
-- 
2.25.3



More information about the Gcc-patches mailing list