[Bug bootstrap/78859] profiledbootstrap failure caused by -Werror=nonnull

jakub at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Mon Dec 19 14:37:00 GMT 2016


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78859

--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
(In reply to Martin Liška from comment #4)
> (In reply to Jakub Jelinek from comment #3)
> > (In reply to Martin Liška from comment #0)
> > > There are 2 (so far) errors reported:
> > > 
> > > 1) gengtype.c:
> > > 
> > > ../../gcc/gengtype.c: In function ‘const char*
> > > get_file_srcdir_relative_path(const input_file*)’:
> > > ../../gcc/gengtype.c:1760:14: error: argument 1 null where non-null expected
> > > [-Werror=nonnull]
> > >    if (strlen (f) > srcdir_len
> > >        ~~~~~~~^~~
> > > 
> > > This is real bug, following patch fixes that:
> > 
> > Only iff get_file_srcdir_relative_path is ever called with NULL inpf.  If
> > not, it is a false positive.  As strlen would crash if it is called with
> > NULL and it has not been reported yet, it clearly is not.
> 
> So with the following patch (and -disable-werror) the profiledbootstrap
> finishes:
> 
> @@ -75,9 +75,8 @@ const char *get_file_srcdir_relative_path (const
> input_file *inpf);
>  static inline const char*
>  get_input_file_name (const input_file *inpf)
>  {
> -  if (inpf)
> -      return inpf->inpname;
> -  return NULL;
> +  gcc_assert (inpf);
> +  return inpf->inpname;
>  }
> 
> Thus, it's regression.

In gengtype.c, it seems the reason for the NULL pointer checks is just a
particular, too cautious, programming style.  gen_input_file_name can return
NULL only if inpf is NULL, which can be NULL if input_file_by_name returns
NULL, which happens if it is called with NULL argument, which likely never
happens.  The question, is -Wnonnull something that should force people to
change their (sometimes weird, sure) programming styles, just to get rid of the
warning?
I believe input_file_by_name is never called with NULL, because:
epos.file = input_file_by_name (listname);
(this is after successful fopen (listname, "r"))
          if (line == 0)
            break;
...
              input_file *inpf = input_file_by_name (line);
should be fine,
      if (optind >= argc)
        fatal ("no source files given in plugin mode");
      nb_plugin_files = argc - optind;
      plugin_files = XNEWVEC (input_file*, nb_plugin_files);
      for (i = 0; i < (int) nb_plugin_files; i++)
        {
          char *name = argv[i + optind];
          plugin_files[i] = input_file_by_name (name);
        }
args before argc should also not contain NULL
  this_file = input_file_by_name (__FILE__);
  system_h_file = input_file_by_name ("system.h");
these two aren't NULL either, and then there are some uses in gengtype-state.c,
likely the state file would need to be corrupted to get NULL.


More information about the Gcc-bugs mailing list