diff --git a/lib/forwardanalyzer.cpp b/lib/forwardanalyzer.cpp index 1f200bc85..7a1fd2afb 100644 --- a/lib/forwardanalyzer.cpp +++ b/lib/forwardanalyzer.cpp @@ -422,7 +422,7 @@ struct ForwardTraversal { return Break(Analyzer::Terminate::Bail); if (allAnalysis.isIncremental()) return Break(Analyzer::Terminate::Bail); - } else { + } else if (allAnalysis.isModified()) { std::vector ftv = tryForkScope(endBlock, allAnalysis.isModified()); bool forkContinue = true; for (ForwardTraversal& ft : ftv) { @@ -448,6 +448,11 @@ struct ForwardTraversal { } if (allAnalysis.isIncremental()) return Break(Analyzer::Terminate::Bail); + } else { + if (updateInnerLoop(endBlock, stepTok, condTok) == Progress::Break) + return Progress::Break; + if (allAnalysis.isIncremental()) + return Break(Analyzer::Terminate::Bail); } return Progress::Continue; } diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index a950b2079..7e47c0324 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -5715,6 +5715,29 @@ private: " } while (b < 1);\n" "}\n"; valueOfTok(code, "b"); + + code = "void ParseEvent(tinyxml2::XMLDocument& doc, std::set& retItems) {\n" + " auto ParseAddItem = [&](Item* item) {\n" + " return retItems.insert(item).second;\n" + " };\n" + " tinyxml2::XMLElement *root = doc.RootElement();\n" + " for (auto *el = root->FirstChildElement(\"Result\"); el && !ParseAddItem(GetItem(el)); el = el->NextSiblingElement(\"Result\")) ;\n" + " for (auto *el = root->FirstChildElement(\"Result\"); el && !ParseAddItem(GetItem(el)); el = el->NextSiblingElement(\"Result\")) ;\n" + " for (auto *el = root->FirstChildElement(\"Result\"); el && !ParseAddItem(GetItem(el)); el = el->NextSiblingElement(\"Result\")) ;\n" + " for (auto *el = root->FirstChildElement(\"Result\"); el && !ParseAddItem(GetItem(el)); el = el->NextSiblingElement(\"Result\")) ;\n" + " for (auto *el = root->FirstChildElement(\"Result\"); el && !ParseAddItem(GetItem(el)); el = el->NextSiblingElement(\"Result\")) ;\n" + " for (auto *el = root->FirstChildElement(\"Result\"); el && !ParseAddItem(GetItem(el)); el = el->NextSiblingElement(\"Result\")) ;\n" + " for (auto *el = root->FirstChildElement(\"Result\"); el && !ParseAddItem(GetItem(el)); el = el->NextSiblingElement(\"Result\")) ;\n" + " for (auto *el = root->FirstChildElement(\"Result\"); el && !ParseAddItem(GetItem(el)); el = el->NextSiblingElement(\"Result\")) ;\n" + " for (auto *el = root->FirstChildElement(\"Result\"); el && !ParseAddItem(GetItem(el)); el = el->NextSiblingElement(\"Result\")) ;\n" + " for (auto *el = root->FirstChildElement(\"Result\"); el && !ParseAddItem(GetItem(el)); el = el->NextSiblingElement(\"Result\")) ;\n" + " for (auto *el = root->FirstChildElement(\"Result\"); el && !ParseAddItem(GetItem(el)); el = el->NextSiblingElement(\"Result\")) ;\n" + " for (auto *el = root->FirstChildElement(\"Result\"); el && !ParseAddItem(GetItem(el)); el = el->NextSiblingElement(\"Result\")) ;\n" + " for (auto *el = root->FirstChildElement(\"Result\"); el && !ParseAddItem(GetItem(el)); el = el->NextSiblingElement(\"Result\")) ;\n" + " for (auto *el = root->FirstChildElement(\"Result\"); el && !ParseAddItem(GetItem(el)); el = el->NextSiblingElement(\"Result\")) ;\n" + " for (auto *el = root->FirstChildElement(\"Result\"); el && !ParseAddItem(GetItem(el)); el = el->NextSiblingElement(\"Result\")) ;\n" + "}\n"; + valueOfTok(code, "root"); } void valueFlowCrashConstructorInitialization() { // #9577