From 526abd4b5211023d782f2d31a933c6f67375884f Mon Sep 17 00:00:00 2001 From: Paul Fultz II Date: Fri, 22 May 2020 15:57:20 -0500 Subject: [PATCH] Fix issue 9738: ValueFlow: handle std::tie better (#2657) --- lib/forwardanalyzer.cpp | 2 ++ test/testvalueflow.cpp | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/lib/forwardanalyzer.cpp b/lib/forwardanalyzer.cpp index 6f0e4d097..08b86e3b1 100644 --- a/lib/forwardanalyzer.cpp +++ b/lib/forwardanalyzer.cpp @@ -110,6 +110,8 @@ struct ForwardTraversal { ForwardAnalyzer::Action action = analyzer->analyze(tok); if (!action.isNone()) analyzer->update(tok, action); + if (action.isInconclusive() && !analyzer->lowerToInconclusive()) + return Progress::Break; if (action.isInvalid()) return Progress::Break; return Progress::Continue; diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index 7e43b9985..2aa39cdeb 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -93,6 +93,7 @@ private: TEST_CASE(valueFlowForwardTernary); TEST_CASE(valueFlowForwardLambda); TEST_CASE(valueFlowForwardTryCatch); + TEST_CASE(valueFlowForwardInconclusiveImpossible); TEST_CASE(valueFlowFwdAnalysis); @@ -2684,6 +2685,19 @@ private: ASSERT_EQUALS(false, testValueOfX(code,3U,16)); } + void valueFlowForwardInconclusiveImpossible() { + const char *code; + + code = "void foo() {\n" + " bool valid = f1();\n" + " if (!valid) return;\n" + " std::tie(endVal, valid) = f2();\n" + " bool x = !valid;" + " bool b = x;" // <- not always true + "}\n"; + ASSERT_EQUALS(false, testValueOfXKnown(code, 6U, 1)); + } + void valueFlowRightShift() { const char *code; /* Set some temporary fixed values to simplify testing */