On Tue, Apr 28, 2020 at 2:44 PM Stefan Schulze Frielinghaus via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > 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?
You need to CC fortran patches to fort...@gcc.gnu.org (done hereby) Richard. > gcc/fortran/ChangeLog: > > 2020-04-28 Stefan Schulze Frielinghaus <stefa...@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 >