Current-Users archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
-fstrict-overflow and -Wstrict-overflow
Hi, all.
While debugging gcc, the behavior of some programs is changes by
-fstrict-overflow.
e.g.:
> tap(msaitoh)% pwd
> /var/sources/NetBSD-current/src/external/gpl3/gcc/dist/gcc/testsuite/gcc.c-torture/execute
> tap(msaitoh)% cat pr23047.c
> #include <limits.h>
> extern void abort ();
> extern void exit (int);
> void f(int i)
> {
> i = i > 0 ? i : -i;
> if (i<0)
> return;
> abort ();
> }
>
> int main(int argc, char *argv[])
> {
> f(INT_MIN);
> exit (0);
> }
> tap(msaitoh)% gcc -O2 pr23047.c -o pr ; ./pr
> Abort (core dumped)
pr23047.c dumps core if it's comiled with -O2.
> tap(msaitoh)% gcc -O2 -fno-strict-overflow pr23047.c -o pr ; ./pr
> tap(msaitoh)%
If -fstrict-overflow is disabled, the test passes
(I found this behavior from the output of "gcc -Q -v").
-fstrict-overflow is enabled by -O2.
> tap(msaitoh)% gcc -Wstrict-overflow -O2 pr23047.c -o pr ; ./pr
> pr23047.c: In function 'f':
> pr23047.c:7:6: warning: assuming signed overflow does not occur when
> simplifying comparison of absolute value and zero
> Abort (core dumped)
-Wstrict-overflow warns.
I checked this behavior on both i386 and arm.
gcc.1 says:
> -Wstrict-overflow
> -Wstrict-overflow=n
> This option is only active when -fstrict-overflow is active. It
> warns about cases where the compiler optimizes based on the
> assumption that signed overflow does not occur. Note that it does
> not warn about all cases where the code might overflow: it only
> warns about cases where the compiler implements some optimization.
> Thus this warning depends on the optimization level.
>
> An optimization which assumes that signed overflow does not occur
> is perfectly safe if the values of the variables involved are such
> that overflow never does, in fact, occur. Therefore this warning
> can easily give a false positive: a warning about code which is not
> actually a problem. To help focus on important issues, several
> warning levels are defined. No warnings are issued for the use of
> undefined signed overflow when estimating how many iterations a
> loop will require, in particular when determining whether a loop
> will be executed at all.
Some programs that are warned by -Wstrict-overflow really have a bug
in the code itself (not gcc's bug). This warning option is useful on
some cases.
One of (serious) problem that we can't use -Wstrict-overflow by default
is that gcc sometimes misundestand it :-<
How should we use it?
--
-----------------------------------------------
SAITOH Masanobu (msaitoh%execsw.org@localhost
msaitoh%netbsd.org@localhost)
Home |
Main Index |
Thread Index |
Old Index