From 9213ce8186aa3bf6af27ab4c5d6301e6a6197cb0 Mon Sep 17 00:00:00 2001 From: chrchr Date: Thu, 6 Jul 2023 12:45:58 +0200 Subject: [PATCH 1/2] Fix #11139 False positive: unreadVariable for aliased data --- lib/fwdanalysis.cpp | 4 ++++ test/testunusedvar.cpp | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/lib/fwdanalysis.cpp b/lib/fwdanalysis.cpp index 3d6078c2d04..ae389bab2c7 100644 --- a/lib/fwdanalysis.cpp +++ b/lib/fwdanalysis.cpp @@ -530,6 +530,10 @@ bool FwdAnalysis::possiblyAliased(const Token *expr, const Token *startToken) co addrOf = tok->astOperand1(); else if (Token::simpleMatch(tok, "std :: ref (")) addrOf = tok->tokAt(3)->astOperand2(); + else if (tok->valueType() && tok->valueType()->pointer && + (Token::Match(tok, "%var% = %var% ;") || Token::Match(tok, "%var% {|( %var% }|)")) && + Token::Match(expr->previous(), "%varid% [", tok->tokAt(2)->varId())) + addrOf = tok->tokAt(2); else continue; diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index 6bccad45f18..74f48168776 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -165,6 +165,7 @@ class TestUnusedVar : public TestFixture { TEST_CASE(localvaralias19); // ticket #9828 TEST_CASE(localvaralias20); // ticket #10966 TEST_CASE(localvaralias21); + TEST_CASE(localvaralias22); TEST_CASE(localvarasm); TEST_CASE(localvarstatic); TEST_CASE(localvarextern); @@ -5037,6 +5038,25 @@ class TestUnusedVar : public TestFixture { ASSERT_EQUALS("", errout.str()); } + void localvaralias22() { // #11139 + functionVariableUsage("int f() {\n" + " int x[1], *p = x;\n" + " x[0] = 42;\n" + " return *p;\n" + "}\n" + "int g() {\n" + " int x[1], *p{ x };\n" + " x[0] = 42;\n" + " return *p;\n" + "}\n" + "int h() {\n" + " int x[1], *p(x);\n" + " x[0] = 42;\n" + " return *p;\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); + } + void localvarasm() { functionVariableUsage("void foo(int &b)\n" From 9fc9754515c2b240acae36be6ae6f87612197e77 Mon Sep 17 00:00:00 2001 From: chrchr Date: Thu, 6 Jul 2023 13:11:33 +0200 Subject: [PATCH 2/2] Fix #11817 FP unreadVariable with reference and else if --- lib/fwdanalysis.cpp | 2 ++ test/testunusedvar.cpp | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/lib/fwdanalysis.cpp b/lib/fwdanalysis.cpp index ae389bab2c7..93c06c62754 100644 --- a/lib/fwdanalysis.cpp +++ b/lib/fwdanalysis.cpp @@ -364,6 +364,8 @@ struct FwdAnalysis::Result FwdAnalysis::checkRecursive(const Token *expr, const const Result &result1 = checkRecursive(expr, tok->tokAt(2), tok->linkAt(1), exprVarIds, local, inInnerClass, depth); if (result1.type == Result::Type::READ || result1.type == Result::Type::BAILOUT) return result1; + if (mWhat == What::UnusedValue && result1.type == Result::Type::WRITE && expr->variable() && expr->variable()->isReference()) + return result1; if (mWhat == What::ValueFlow && result1.type == Result::Type::WRITE) mValueFlowKnown = false; if (mWhat == What::Reassign && result1.type == Result::Type::BREAK) { diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index 74f48168776..49c024c3af1 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -166,6 +166,7 @@ class TestUnusedVar : public TestFixture { TEST_CASE(localvaralias20); // ticket #10966 TEST_CASE(localvaralias21); TEST_CASE(localvaralias22); + TEST_CASE(localvaralias23); TEST_CASE(localvarasm); TEST_CASE(localvarstatic); TEST_CASE(localvarextern); @@ -5057,6 +5058,17 @@ class TestUnusedVar : public TestFixture { ASSERT_EQUALS("", errout.str()); } + void localvaralias23() { // #11817 + functionVariableUsage("void f(int& r, bool a, bool b) {\n" + " int& e = r;\n" + " if (a)\n" + " e = 42;\n" + " else if (b)\n" + " e = 1;\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); + } + void localvarasm() { functionVariableUsage("void foo(int &b)\n"