diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 325a55e98e5..aa0b2c91c29 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -5422,6 +5422,11 @@ static void valueFlowForLoopSimplifyAfter(Token* fortok, nonneg int varid, const endToken = fortok->scope()->bodyEnd; Token* blockTok = fortok->linkAt(1)->linkAt(1); + if (const Token* escape = findEscapeStatement(blockTok->scope(), settings.library)) { + if (settings.debugwarnings) + bailout(tokenlist, errorLogger, escape, "For loop variable bailout on escape statement"); + return; + } if (blockTok != endToken) { ValueFlow::Value v{num}; v.errorPath.emplace_back(fortok,"After for loop, " + var->name() + " has value " + v.infoString()); diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index cc793f58873..e9399d62a30 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -1323,6 +1323,10 @@ class TestTokenizer : public TestFixture { "return ; } }\n\n" "return ;\n" "}", tokenizeAndStringify(code)); + ASSERT_EQUALS_WITHOUT_LINENUMBERS( + "[test.cpp:5:1]: (debug) valueflow.cpp:5427:valueFlowForLoopSimplifyAfter bailout: For loop variable bailout on escape statement [valueFlowBailout]\n" + "[test.cpp:5:1]: (debug) valueflow.cpp:5427:valueFlowForLoopSimplifyAfter bailout: For loop variable bailout on escape statement [valueFlowBailout]\n", + errout_str()); } void ifAddBraces7() { diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index 56bd0e26ce2..54d80f458f6 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -5143,6 +5143,18 @@ class TestValueFlow : public TestFixture { ++it; ASSERT_EQUALS(5, it->intvalue); ASSERT(it->isImpossible()); + + code = "int a[5];\n" // #14998 + "int f() {\n" + " int i;\n" + " for (i = 0; true; ++i) {\n" + " if (i == 4)\n" + " break;\n" + " }\n" + " return a[i];\n" + "}\n"; + values = tokenValues(code, "i ]"); + ASSERT(values.empty()); } void valueFlowSubFunction() {