diff --git a/lib/forwardanalyzer.cpp b/lib/forwardanalyzer.cpp index 6590f0ebd..a3dd51111 100644 --- a/lib/forwardanalyzer.cpp +++ b/lib/forwardanalyzer.cpp @@ -209,6 +209,7 @@ struct ForwardTraversal { } Progress updateLoop(Token* endBlock, Token* condTok, Token* initTok = nullptr, Token* stepTok = nullptr) { + const bool isDoWhile = precedes(endBlock, condTok); ForwardAnalyzer::Action bodyAnalysis = analyzeScope(endBlock); ForwardAnalyzer::Action allAnalysis = bodyAnalysis; if (condTok) @@ -225,7 +226,7 @@ struct ForwardTraversal { return Progress::Break; } // Traverse condition after lowering - if (condTok) { + if (condTok && (!isDoWhile || !bodyAnalysis.isModified())) { if (updateRecursive(condTok) == Progress::Break) return Progress::Break; diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 6cda95d44..36f24fc74 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -4430,6 +4430,16 @@ private: " f += 1;\n" "}\n"); ASSERT_EQUALS("", errout.str()); + + valueFlowUninit("unsigned char get();\n" + "char f() {\n" + " unsigned char c;\n" + " do {\n" + " c = get();\n" + " } while (isalpha(c) == 0);\n" + " return static_cast(c);\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); } void uninitvar_ipa() {