On 12/11/2016 05:21 PM, Martin Sebor wrote:
So I think the return value needs a bit of clarification here.  Take
guidance from our discussion on this thread.

OK with that fixed.

jeff

The "strange test failures​" that I wrote about in a separate thread
late last week prompted me to re-review the patch and add more test
cases.  Those in turn exposed a bug in the adjust_range_for_overflow
function involving types of the same precision but different sign
where converting an unsigned range with an upper bound in excess of
the directive's TYPE_MAX would incorrectly accept the converted range
even though the new upper bound was less than the lower bound.

The updated  patch corrects this oversight.  In addition, it adjusts
the handling of the obscure corner case of zero precision and zero
argument which results in zero bytes (except in some even more
obscure cases involving some flags for some conversions).  For
instance:

  printf ("%.0i", 0);

results in zero bytes, but

  printf ("%+.0i", 0);

results in 1 byte (and prints '+').  This is tracked in bug 78606.

Although the differences between the approved patch and the update
are very small I repost it in case one of you would like to double
check them.  If not I'll commit the updated patch later in the week.

Martin

gcc-78622.diff


PR middle-end/78622 - -Wformat-length/-fprintf-return-value incorrect with 
overflow/wrapping
PR middle-end78606 - -Wformat-length/-fprintf-return-value incorrect for %+.0i 
and %.0o with zero value

gcc/ChangeLog:

        PR middle-end/78622
        * gimple-ssa-sprintf.c (min_bytes_remaining): Use res.knownrange
        rather than res.bounded.
        (get_width_and_precision): Set precision to -1 when negative.
        (adjust_range_for_overflow): New function.
        (format_integer): Correct the handling of the space, plus, and pound
        flags, and the special case of zero precision.
        Always set res.bounded to true unless either precision or width
        is specified and unknown.
        Call adjust_range_for_overflow.
        Avoid use zero as the shortest value when precision is specified
        but unknown.
        (format_directive): Remove vestigial quoting.  Always inform of
        argument value or range when it's available.
        (add_bytes): Correct the computation of boundrange used to
        decide whether a warning is of a "maybe" or "defnitely" kind.

gcc/testsuite/ChangeLog:

        PR middle-end/78622
        * gcc.c-torture/execute/pr78622.c: New test.
        * gcc.dg/tree-ssa/builtin-sprintf-2.c: Remove "benign" undefined
        behavior inadvertently introduced in a previous commit.  Tighten
        up final checking.
        * gcc.dg/tree-ssa/builtin-sprintf-5.c: Rename macros for clarity.
        Add test cases.
        * gcc.dg/tree-ssa/builtin-sprintf-6.c: Add test cases.
        * 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-5.c: Same.
        * gcc.dg/tree-ssa/builtin-sprintf-warn-6.c: Remove xfails and
        add a final optimization check.
        * gcc.dg/tree-ssa/builtin-sprintf.c: Add test cases.
        * gcc.dg/tree-ssa/pr78622.c: New test.

OK.

jeff

Reply via email to