GCC HEAD now warns about this testcase for mips-linux, reduced from gdb/value.c. Compile with -O2 -Wall: extern int foo(); int show_values (void) { int i; static int num; if (num <= 0) num = 1; for (i = num; i < num + 10; i++) foo(); return i; } overflow.c:10: warning: assuming signed overflow does not occur when assuming that (X + c) >= X is always true I think that the problem arises when we assume that the loop is executed at least once; the initial condition is num < num + 10. However the warning does not arise if num is an argument to the function instead of a static variable. Unfortunately the warning appears to be correct. I say unfortunately because there's no apparent way to avoid the warning - which sounds more like -Wextra to -Wall. Does this this example contradict the "easy to avoid" statement in the -Wstrict-overflow=1 documentation?
Subject: Re: New: Overflow warning causes GDB -Werror build failure On Tue, Apr 17, 2007 at 12:21:36PM -0000, drow at gcc dot gnu dot org wrote: > GCC HEAD now warns about this testcase for mips-linux, reduced from > gdb/value.c. The warning also occurs once in top.c: for (offset = num; offset < num + Hist_print && offset < hist_len; offset++)
Yes, the warning is happening because gcc relies on undefined signed overflow when assuming that it will execute the loop at least once. Of course when using -fwrapv the loop should not be executed at all when num > INT_MAX - 10. I'll try to figure out what to do about this.
Created attachment 13394 [details] Proposed patch This patch fixes the test case in the PR. I am testing it. It would be interesting to hear whether it also fixes the actual code in gdb.
Subject: Re: Overflow warning causes GDB -Werror build failure On Fri, Apr 20, 2007 at 03:17:19PM -0000, ian at airs dot com wrote: > This patch fixes the test case in the PR. I am testing it. It would be > interesting to hear whether it also fixes the actual code in gdb. With this patch I can successfully build GDB for mips-linux - thanks! (barring PR31605).
Subject: Bug 31602 Author: ian Date: Tue Apr 24 21:44:45 2007 New Revision: 124120 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=124120 Log: ./: PR tree-optimization/31602 * tree-ssa-loop-ch.c (copy_loop_headers): Set TREE_NO_WARNING for conditionals in the copied loop header. * tree-cfg.c (fold_cond_expr_cond): Don't issue undefined overflow warnings if TREE_NO_WARNING is set. * doc/invoke.texi (Warning Options): Clarify that -Wstrict-overflow does not warn about loops. testsuite/: PR tree-optimization/31602 * gcc.dg/Wstrict-overflow-11.c: We no longer issue a warning. Modified: trunk/gcc/ChangeLog trunk/gcc/doc/invoke.texi trunk/gcc/testsuite/ChangeLog trunk/gcc/testsuite/gcc.dg/Wstrict-overflow-11.c trunk/gcc/tree-cfg.c trunk/gcc/tree-ssa-loop-ch.c
Subject: Bug 31602 Author: ian Date: Tue Apr 24 22:54:22 2007 New Revision: 124127 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=124127 Log: PR tree-optimization/31602 * tree-ssa-loop-ch.c (copy_loop_headers): Set TREE_NO_WARNING for conditionals in the copied loop header. * tree-cfg.c (fold_cond_expr_cond): Don't issue undefined overflow warnings if TREE_NO_WARNING is set. * doc/invoke.texi (Warning Options): Clarify that -Wstrict-overflow does not warn about loops. Modified: branches/gcc-4_2-branch/gcc/ChangeLog branches/gcc-4_2-branch/gcc/doc/invoke.texi branches/gcc-4_2-branch/gcc/tree-cfg.c branches/gcc-4_2-branch/gcc/tree-ssa-loop-ch.c
Fixed on mainline and 4.2 branch.