fortran/io.c: Fix use of uninitialized variable num [PR94769]
authorStefan Schulze Frielinghaus <stefansf@linux.ibm.com>
Tue, 28 Apr 2020 11:14:28 +0000 (13:14 +0200)
committerStefan Schulze Frielinghaus <stefansf@linux.ibm.com>
Wed, 29 Apr 2020 14:37:18 +0000 (16:37 +0200)
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.

Initialized num to -1 and added an assert statement.

gcc/fortran/ChangeLog:

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

        PR fortran/94769
        * io.c (check_io_constraints): Initialize local variable num to
        -1 and assert that it receives a meaningful value by function
        compare_to_allowed_values.

gcc/fortran/ChangeLog
gcc/fortran/io.c

index 1e6b593163d521ad35761917a753f36d93352c29..f245cb4d7c05c9576b957809aa538626080015b2 100644 (file)
@@ -1,3 +1,10 @@
+2020-04-29  Stefan Schulze Frielinghaus  <stefansf@linux.ibm.com>
+
+       PR fortran/94769
+       * io.c (check_io_constraints): Initialize local variable num to
+       -1 and assert that it receives a meaningful value by function
+       compare_to_allowed_values.
+
 2020-04-27  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        PR fortran/93956
index e066666e01d14d2c4ad4a6f5afed1ee10b9172f8..981cf9e88ddeb7433436f25b47e47bdbef6261d3 100644 (file)
@@ -3840,7 +3840,7 @@ if (condition) \
 
   if (dt->asynchronous)
     {
-      int num;
+      int num = -1;
       static const char * asynchronous[] = { "YES", "NO", NULL };
 
       /* Note: gfc_reduce_init_expr reports an error if not init-expr.  */
@@ -3853,6 +3853,8 @@ if (condition) \
                 io_kind_name (k), warn, &dt->asynchronous->where, &num))
        return false;
 
+      gcc_checking_assert (num != -1);
+
       /* For "YES", mark related symbols as asynchronous.  */
       if (num == 0)
        {