From ec6133aea28dfdf6a56fd01078ffac534b2f5621 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Fri, 16 Mar 2018 19:13:48 +0100 Subject: [PATCH] Fixed #8182 (False positive uninitvar - variable initialized in function in ternary expression) --- lib/valueflow.cpp | 9 +++++++++ test/testsizeof.cpp | 2 +- test/testvalueflow.cpp | 13 +++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 13a8a843d..5ced2fcfc 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -1899,6 +1899,7 @@ static bool valueFlowForward(Token * const startToken, } // Skip conditional expressions.. + const Token * const questionToken = tok2; while (tok2->astOperand1() || tok2->astOperand2()) { if (tok2->astOperand2()) tok2 = const_cast(tok2->astOperand2()); @@ -1908,6 +1909,14 @@ static bool valueFlowForward(Token * const startToken, break; } tok2 = tok2->next(); + + if (isVariableChanged(questionToken, questionToken->astOperand2(), varid, false, settings) && + isVariableChanged(questionToken->astOperand2(), tok2, varid, false, settings)) { + if (settings->debugwarnings) + bailout(tokenlist, errorLogger, tok2, "variable " + var->name() + " valueFlowForward, assignment in condition"); + return false; + + } } else if (tok2->varId() == varid) { diff --git a/test/testsizeof.cpp b/test/testsizeof.cpp index 8ff21d8b2..26e76e3c5 100644 --- a/test/testsizeof.cpp +++ b/test/testsizeof.cpp @@ -203,7 +203,7 @@ private: check("int a=sizeof(foo())"); ASSERT_EQUALS("", errout.str()); - + check("int foo(int) { return 1; }; char buf[1024]; int a=sizeof(buf), foo(0)"); ASSERT_EQUALS("", errout.str()); diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index c839b288d..adb861168 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -80,6 +80,7 @@ private: TEST_CASE(valueFlowForwardCompoundAssign); TEST_CASE(valueFlowForwardCorrelatedVariables); TEST_CASE(valueFlowForwardFunction); + TEST_CASE(valueFlowForwardTernary); TEST_CASE(valueFlowForwardLambda); TEST_CASE(valueFlowSwitchVariable); @@ -1837,6 +1838,18 @@ private: ASSERT_EQUALS(true, testValueOfX(code, 8U, 1)); } + void valueFlowForwardTernary() { + const char *code; + + code = "int f() {\n" + " int x=5;\n" + " a = b ? init1(&x) : init2(&x);\n" + " return 1 + x;\n" + "}"; + ASSERT_EQUALS(true, testValueOfX(code, 3U, 5)); + ASSERT_EQUALS(false, testValueOfX(code, 4U, 5)); + } + void valueFlowForwardLambda() { const char *code;