[PATCH 4/5] distinguish likely and unlikely results (PR 78703)
Christophe Lyon
christophe.lyon@linaro.org
Thu Jan 26 22:29:00 GMT 2017
On 26 January 2017 at 00:31, Jeff Law <law@redhat.com> wrote:
> On 01/22/2017 04:53 PM, Martin Sebor wrote:
>>
>> The attached patch adds the concept of likely and unlikely results
>> of formatted functions to improve the quality of diagnostics (reduce
>> false positives and negatives) while at the same time allowing for
>> rare cases such as a multibyte decimal point in floating point output
>> or excessive width or precision bounds (when width and precision range
>> support is added, in the final patch of the series). To this end,
>> this patch makes the following changes:
>>
>> 1) Eliminate the format_result exact byte counter (since its value
>> can be determined from the other counters) and introduce the likely
>> and unlikely counters. The likely counter is considered (along
>> with the min and max counters) when deciding whether a directive
>> that may write too many bytes should be diagnosed. The unlikely
>> counter is used as the worst case scenario by the return value
>> optimization but not to trigger diagnostics.
>>
>> 2) Eliminate the format_result::bounded flag since its value can
>> be derived from the counters. This simplifies the warning logic.
>>
>> 3) Introduce the fmtresult::adjust_for_width_or_precision() function
>> and factor code that handled width and precision in individual type-
>> specific format_xxx handlers out of those handlers and into it.
>> This reduce code duplication, avoiding subtle inconsistencies.
>>
>> 4) Introduce the type_max_digits() function to compute the likely
>> amount of output for integer directives with unknown (and thus
>> possibly unlimited) precision and width. This reduces the rate
>> of false positives.
>>
>> 5) Consolidate the min_bytes_remaining() function into
>> bytes_remaining() to handle all counters consistently. This again
>> reduces code duplication and subtle inconsistencies.
>>
>> 6) Complete the consolidation of handling sequences of plain format
>> characters with format specifications (that start with %) and remove
>> the add_bytes function.
>>
>> 7) Introduce the should_warn_p() function and move the logic
>> to determine whether the result of a format directive should be
>> diagnosed out of format_directive and into it.
>>
>> 8) Update diagnostics to make use of the new counters.
>>
>> gcc-78703-4.diff
>>
>>
>> commit c9a95d19eb307b7df06c1285325b23746ddbc738
>> Author: Martin Sebor <msebor@redhat.com>
>> Date: Sun Jan 22 11:48:13 2017 -0700
>>
>> 2017-01-22 Martin Sebor <msebor@redhat.com>
>>
>> * gimple-ssa-sprintf.c (struct result_range): Add likely and
>> unlikely counters.
>> (struct format_result): Replace number_chars, number_chars_min,
>> and number_chars_max with a single member of struct result_range.
>> Remove bounded.
>> (format_result::operator+=): Adjust.
>> (struct fmtresult): Remove bounded. Handle likely and unlikely
>> counters.
>> (fmtresult::adjust_for_width_or_precision): New function.
>> (fmtresult:type_max_digits): New function.
>> (bytes_remaining): Handle likely and unlikely counters.
>> (min_bytes_remaining): Remove.
>> (format_percent): Simplify.
>> (format_integer, format_floating): Set likely and unlikely
>> counters.
>> (get_string_length, format_character, format_string): Same.
>> (format_plain, should_warn_p): New function.
>> (maybe_warn): Call should_warn_p. Update diagnostic messages
>> and handle those for all directives, including plain strings.
>> (format_directive): Handle likely and unlikely counters.
>> Remove unnecessary quoting from diagnostics. Add an informational
>> note.
>> (add_bytes): Remove.
>> (pass_sprintf_length::compute_format_length): Simplify.
>> (try_substitute_return_value): Handle likely and unlikely
>> counters.
>>
>> gcc/testsuite/
>> * gcc.dg/tree-ssa/builtin-snprintf-warn-2.c: Adjust.
>> * gcc.dg/tree-ssa/builtin-sprintf-2.c: Same.
>> * gcc.dg/tree-ssa/builtin-sprintf-5.c: Same.
>> * gcc.dg/tree-ssa/builtin-sprintf-warn-1.c: Same.
>> * gcc.dg/tree-ssa/builtin-sprintf-warn-2.c: Same.
>> * gcc.dg/tree-ssa/builtin-sprintf-warn-3.c: Same.
>> * gcc.dg/tree-ssa/builtin-sprintf-warn-4.c: Same.
>> * gcc.dg/tree-ssa/builtin-sprintf-warn-6.c: Same.
>> * gcc.dg/tree-ssa/builtin-sprintf-warn-7.c: Same.
>> * gcc.dg/tree-ssa/builtin-sprintf-warn-9.c: Same.
>> * gcc.dg/tree-ssa/builtin-sprintf.c: Same.
>
> So I see the introduction of many
>
> if (const OP object) expressions
>
> Can you please fix those as an independent patch after #4 and #5 are
> installed on the trunk? Consider that patch pre-approved, but please post
> it here for the historical record.
>
> I think a regexp of paren followed by a constant would probably take you to
> them pretty quickly.
>
> I'm going to trust that the actual computations, particularly in format_*
> are correct. You know this stuff far better than I.
>
> I probably would have tried to break this down further, but in the interests
> if getting this wrapped up, I've just slogged my way through it. For the
> future, I would have tried to break each format_XXX patch out.
> Should_warn_p and the simplifications it enabled would have been another
> patch, etc.
>
>
> OK for the trunk.
>
> jeff
Hi,
With this patch all my builds for aarch64/arm failed:
/gcc/gimple-ssa-sprintf.c: In function
‘<unnamed>::fmtresult<unnamed>::format_floating(const<unnamed>::direc
tive&, tree_node*)’:
/gcc/gimple-ssa-sprintf.c:1643: error: ‘XFmode’ was not declared in this scope
Is this fixed later in the series?
Christophe
More information about the Gcc-patches
mailing list