public inbox for gcc-bugs@sourceware.org help / color / mirror / Atom feed
* [Bug c/106463] New: Incorrect value for loop terminating test. for loop runs when it should not. @ 2022-07-28 11:19 gordon.lack at dsl dot pipex.com 2022-07-28 11:20 ` [Bug c/106463] " gordon.lack at dsl dot pipex.com ` (3 more replies) 0 siblings, 4 replies; 5+ messages in thread From: gordon.lack at dsl dot pipex.com @ 2022-07-28 11:19 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106463 Bug ID: 106463 Summary: Incorrect value for loop terminating test. for loop runs when it should not. Product: gcc Version: 11.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: gordon.lack at dsl dot pipex.com Target Milestone: --- Created attachment 53371 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=53371&action=edit Preprocessed .i file For the simple loop: int maxnum = power10(n); for (int unum = 0; unum < maxnum; unum++) { some code... } the loop will run (multiple times) even if maxnum is -ve (a result of an overflow in powr10). This happens for -O3 and -O2, but not -O1 or -O0 using gcc11.2.0 (on Kubuntu 22.04). Also happens on gcc: 10.2.1 7.4.0 On 4.4.7 (Centos6) it only passes through the loop once (which is still wrong). The raw test.c file to show the problem is short: ========================================================== #include <stdlib.h> #include <string.h> static int power10(int exp) { int res = 1; while (exp-- > 0) res *= 10; return res; } static char testname[32] = "test"; static int namelen = 4; static char name[32]; void *bfind(char *fn, int cflag, int bflag) { snprintf(fn, 32, "%d %d", cflag, bflag); return fn; } int main(int argc, char *argv[]) { if (!argv[1]) return 2; int numlen = atoi(argv[1]); int maxnum = power10(numlen); printf("Loop max %d\n", maxnum); for (int unum = 0; unum < maxnum; unum++) { printf("Loop var %d (max %d)\n", unum, maxnum); printf("Loop end cond %d\n", (unum < maxnum)); snprintf(testname + namelen, 28, "%d", unum); if (bfind(testname, 0, 0) == NULL) { strcpy(name, testname); return 0; } } return 1; } ^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug c/106463] Incorrect value for loop terminating test. for loop runs when it should not. 2022-07-28 11:19 [Bug c/106463] New: Incorrect value for loop terminating test. for loop runs when it should not gordon.lack at dsl dot pipex.com @ 2022-07-28 11:20 ` gordon.lack at dsl dot pipex.com 2022-07-28 11:36 ` gordon.lack at dsl dot pipex.com ` (2 subsequent siblings) 3 siblings, 0 replies; 5+ messages in thread From: gordon.lack at dsl dot pipex.com @ 2022-07-28 11:20 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106463 --- Comment #1 from Gordon Lack <gordon.lack at dsl dot pipex.com> --- Sorry. The first line of test.c was missing in that cut&paste. There's a missing: #include <stdio.h> ^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug c/106463] Incorrect value for loop terminating test. for loop runs when it should not. 2022-07-28 11:19 [Bug c/106463] New: Incorrect value for loop terminating test. for loop runs when it should not gordon.lack at dsl dot pipex.com 2022-07-28 11:20 ` [Bug c/106463] " gordon.lack at dsl dot pipex.com @ 2022-07-28 11:36 ` gordon.lack at dsl dot pipex.com 2022-07-28 12:01 ` pinskia at gcc dot gnu.org 2022-07-28 16:43 ` gordon.lack at dsl dot pipex.com 3 siblings, 0 replies; 5+ messages in thread From: gordon.lack at dsl dot pipex.com @ 2022-07-28 11:36 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106463 --- Comment #2 from Gordon Lack <gordon.lack at dsl dot pipex.com> --- Compilation options: gcc -O3 test.c -o test (or -O1) For gcc 4.4.7 it also needs -std=c99. And I'll also note that the gcc10.2.1 was on an armv7l system, while the 7.4.0 was on an arm64 one. It's also the same on 7.20 on a mips system. ^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug c/106463] Incorrect value for loop terminating test. for loop runs when it should not. 2022-07-28 11:19 [Bug c/106463] New: Incorrect value for loop terminating test. for loop runs when it should not gordon.lack at dsl dot pipex.com 2022-07-28 11:20 ` [Bug c/106463] " gordon.lack at dsl dot pipex.com 2022-07-28 11:36 ` gordon.lack at dsl dot pipex.com @ 2022-07-28 12:01 ` pinskia at gcc dot gnu.org 2022-07-28 16:43 ` gordon.lack at dsl dot pipex.com 3 siblings, 0 replies; 5+ messages in thread From: pinskia at gcc dot gnu.org @ 2022-07-28 12:01 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106463 Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |RESOLVED Resolution|--- |INVALID --- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Signed integer overflow is undefined. Use -fsanitize=undefined to detect this st runtime. ^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug c/106463] Incorrect value for loop terminating test. for loop runs when it should not. 2022-07-28 11:19 [Bug c/106463] New: Incorrect value for loop terminating test. for loop runs when it should not gordon.lack at dsl dot pipex.com ` (2 preceding siblings ...) 2022-07-28 12:01 ` pinskia at gcc dot gnu.org @ 2022-07-28 16:43 ` gordon.lack at dsl dot pipex.com 3 siblings, 0 replies; 5+ messages in thread From: gordon.lack at dsl dot pipex.com @ 2022-07-28 16:43 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106463 --- Comment #4 from Gordon Lack <gordon.lack at dsl dot pipex.com> --- OK. Agreed. It's in the C99 standard that signed integer overflow is undefined behaviour. Thanks for the reply. ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2022-07-28 16:43 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2022-07-28 11:19 [Bug c/106463] New: Incorrect value for loop terminating test. for loop runs when it should not gordon.lack at dsl dot pipex.com 2022-07-28 11:20 ` [Bug c/106463] " gordon.lack at dsl dot pipex.com 2022-07-28 11:36 ` gordon.lack at dsl dot pipex.com 2022-07-28 12:01 ` pinskia at gcc dot gnu.org 2022-07-28 16:43 ` gordon.lack at dsl dot pipex.com
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).