https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113752
--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> --- That said, the math at least in the reduced testcase is weird. %d output is at most 11 bytes - strlen ("-2147483648"), + 9 other chars, so that is 42, not 32. But even using + 42 in there instead of 32 doesn't fix it. It wouldn't surprise me if the misdesigned warning just sees that each of the strlens clearly has a range [0, 10256-42], after all, when expressed as a range there isn't much more to derive about it, and then uses that [0, 10214] range for each of the %s specifiers. Though, that is not what the warning says. Ah, maybe it is because j is known short after inlining or some IPA opts. Also, because the strlen + strlen + strlen + cst > cst2 condition uses unsigned type, wrap around is theoretically possible, e.g. one could have some PTRDIFF_MAX - epsilon sized string and call it with c = g = j that string.