On Thu, 2016-08-04 at 12:08 -0600, Jeff Law wrote:
> On 08/03/2016 09:45 AM, David Malcolm wrote:
> > This patch updates c-format.c to use the new class substring_loc,
> > added
> > in the previous patch, replacing location_column_from_byte_offset.
> > Hence with this patch, Wformat can underline the precise erroneous
> > format string in many more cases.
> > 
> > The patch also introduces two new functions for emitting Wformat
> > warnings: format_warning_at_substring and format_warning_at_char,
> > providing an inform in the face of macros where the pertinent part
> > of
> > the format string may be separate from the function call.
> > 
> > Successfully bootstrapped&regrtested in conjunction with the rest
> > of the
> > patch kit on x86_64-pc-linux-gnu.
> > 
> > (The v2 version of the patch had a successful selftest run for
> > stage 1 on
> > powerpc-ibm-aix7.1.3.0 (gcc111) in conjunction with the rest of the
> > patch
> > kit, and a successful build of stage1 for all targets via config
> > -list.mk;
> > the patch has only been rebased since)
> > 
> > OK for trunk if it passes individual testing? (on top of patches 1
> > -2)
> > 
> > gcc/c-family/ChangeLog:
> >     PR c/52952
> >     * c-format.c: Include "diagnostic.h".
> >     (location_column_from_byte_offset): Delete.
> >     (location_from_offset): Delete.
> >     (format_warning_va): New function.
> >     (format_warning_at_substring): New function.
> >     (format_warning_at_char): New function.
> >     (check_format_arg): Capture location of format_tree and pass to
> >     check_format_info_main.
> >     (check_format_info_main): Add params FMT_PARAM_LOC and
> >     FORMAT_STRING_CST.  Convert calls to warning_at to calls to
> >     format_warning_at_char.  Pass a substring_loc instance to
> >     check_format_types.
> >     (check_format_types): Convert first param from a location_t
> >     to a const substring_loc & and rename to "fmt_loc".  Attempt
> >     to extract the range of the relevant parameter and pass it
> >     to format_type_warning.
> >     (format_type_warning): Convert first param from a location_t
> >     to a const substring_loc & and rename to "fmt_loc".  Add
> >     params "param_range" and "type".  Replace calls to warning_at
> >     with calls to format_warning_at_substring.
> > 
> > gcc/testsuite/ChangeLog:
> >     PR c/52952
> >     * gcc.dg/cpp/pr66415-1.c: Likewise.
> >     * gcc.dg/format/asm_fprintf-1.c: Update column numbers.
> >     * gcc.dg/format/c90-printf-1.c: Likewise.
> >     * gcc.dg/format/diagnostic-ranges.c: New test case.
> > ---
> > 
> 
> > @@ -1758,6 +1859,7 @@ check_format_info_main (format_check_results
> > *res,
> >       ++format_chars;
> >       continue;
> >     }
> > +      const char *start_of_this_format = format_chars;
> Do you realize that this isn't used for ~700 lines after this point? 
>  Is 
> there any sensible way to factor some code here to avoid the coding 
> disconnect.  I realize the function was huge before you got in here,
> but 
> if at all possible, I'd like to see a bit of cleanup.
> 
> I think this is OK after that cleanup.

format_chars can get modified in numerous places in the intervening
lines, which is why I stash the value there.

I can do some kind of cleanup of check_format_info_main, maybe
splitting out the things in the body of loop, moving them to support
functions.

That said, I note that Martin's sprintf patch:
  https://gcc.gnu.org/ml/gcc-patches/2016-07/msg00056.html
also touches those ~700 lines in check_format_info_main in over a dozen
places.  Given that, would you prefer I do the cleanup before or after
the substring_loc patch?

[CCing Martin]

Reply via email to