https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118013
Bug ID: 118013 Summary: bogus "infinite loop" warning Product: gcc Version: 14.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: analyzer Assignee: dmalcolm at gcc dot gnu.org Reporter: bruno at clisp dot org Target Milestone: --- Created attachment 59844 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=59844&action=edit test case i.c Compiling the attached file i.c with gcc 14.2.0 (without or with optimization) produces a "warning: infinite loop". But there is no infinite loop, because: - If at line 93, j < nsubst, line 90 has incremented i. - If at line 93, j == nsubst, i gets incremented. $ gcc-version -Wall -fanalyzer -S i.c i.c: In function ‘subst_string’: i.c:72:18: warning: infinite loop [CWE-835] [-Wanalyzer-infinite-loop] 72 | if (str[i] == '\0') | ^ ‘subst_string_list’: event 1 | | 101 | subst_string_list (string_list_ty *slp, | | ^~~~~~~~~~~~~~~~~ | | | | | (1) entry to ‘subst_string_list’ | +--> ‘subst_string’: events 2-11 | | 52 | subst_string (const char *str, | | ^~~~~~~~~~~~ | | | | | (2) entry to ‘subst_string’ |...... | 72 | if (str[i] == '\0') | | ~ ~ | | | | | | | (3) infinite loop here | | | (11) ...to here | | (4) if it ever follows ‘false’ branch, it will always do so... | | (9) ...to here | | (10) looping back... | 73 | break; | 74 | for (j = 0; j < nsubst; j++) | | ~~~~~ ~~~~~~~~~~ | | | | | | | (6) when ‘j >= nsubst’: always following ‘false’ branch... | | (5) ...to here |...... | 93 | if (j == nsubst) | | ~ | | | | | (7) ...to here | | (8) when ‘j != nsubst’: always following ‘false’ branch... |