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
>

Reply via email to