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;
}