On 2024-07-26 13:11, Jakub Jelinek wrote:
On Thu, Jul 25, 2024 at 07:48:38PM -0400, Siddhesh Poyarekar wrote:
The code to scale ranges for wide chars in format_string incorrectly
checks range.likely to scale range.unlikely, which is a copy-paste typo
from the immediate previous condition.

gcc/ChangeLog:

        gimple-ssa-sprintf.cc (format_string): Fix type in range check
        for UNLIKELY for wide chars.

Signed-off-by: Siddhesh Poyarekar <siddh...@gotplt.org>

LGTM.

Thanks, pushed.

What exactly the code really wants to do is unclear to me, what does
the INT_MAX on the target have to do with the minimum/maximum/expected
sizes of %S or %ls printed strings is unclear, target PTRDIFF_MAX

I think that is because the printf family returns the number of bytes/chars written in an int, which imposes the INT_MAX limitation on the format string expansion.

maybe.  And why it uses this
          if (slen.range.something < target_int_max ())
            slen.range.something *= something_else;
rather than say
          slen.range.something
            = MIN (slang.range.something * something_else, target_int_max ());
perhaps with some overflow checking is also something that is hard to guess.

That's what I tried first but I settled for the minimal change because I didn't want to dig in deeper than I had time for to at the moment. Further down it checks if MAX and UNLIKELY cross INT_MAX and then resets to INT_MAX, but that looks suspicious on, e.g. 32-bit targets. The code could use some refactoring/cleanup.

Thanks,
Sid

Reply via email to