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)
commit27594524d8a93cddb197ad8c9d4075c5870f1473
treeaa6f9d166bf0d9c88a006852b9c173c6890af7c0
parent392aa7d7adfbd84253121d2ef779bf3c627e8d0b
fortran/io.c: Fix use of uninitialized variable num [PR94769]

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