https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119005
Alejandro Colomar <alx at kernel dot org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Resolution|INVALID |FIXED
--- Comment #2 from Alejandro Colomar <alx at kernel dot org> ---
Hi Andrew,
I have rewritten the code to move the ++ out of the conditional, and I still
get the diagnostic, and I think it's a false positive, according to the
documentation.
alx@debian:~/tmp$ cat foo.c
#include <limits.h>
int
f(void)
{
static int i = 0;
i++;
if (i >= 3)
return -1;
return 0;
}
alx@debian:~/tmp$ gcc -Werror=strict-overflow=2 -Wall -S foo.c
alx@debian:~/tmp$ gcc -Werror=strict-overflow=3 -Wall -S foo.c
foo.c: In function âfâ:
foo.c:12:1: warning: assuming signed overflow does not occur when changing X +-
C1 cmp C2 to X cmp C2 -+ C1 [-Wstrict-overflow]
12 | }
| ^
alx@debian:~/tmp$ MANWIDTH=72 man gcc 2>/dev/null | sed -n
'/-Wstrict-overflow=3/,/^$/p'
-Wstrict-overflow=3
Also warn about other cases where a comparison is
simplified. For example: "x + 1 > 1" is simplified to
"x > 0".
Since that says 'also', we need to check the 1 and 2 levels:
-Wstrict-overflow=1
Warn about cases that are both questionable and easy to avoid.
For example the compiler simplifies "x + 1 > x" to 1. This
level of -Wstrict-overflow is enabled by -Wall; higher levels
are not, and must be explicitly requested.
-Wstrict-overflow=2
Also warn about other cases where a comparison is simplified to
a constant. For example: "abs (x) >= 0". This can only be
simplified when signed integer overflow is undefined, because
"abs (INT_MIN)" overflows to "INT_MIN", which is less than zero.
-Wstrict-overflow (with no level) is the same as
-Wstrict-overflow=2.
While I agree that this might eventually overflow the int, I don't see how the
diagnostic matches the documentation. The diagnostic seems to be about
conditionals, not about overflowing per se, and I don't see how this
conditional is questionable nor constant nor impossible (except for overflow).