From f7824bfd000cc87d54a05e4ee3e4449bc981f298 Mon Sep 17 00:00:00 2001 From: Dmitry-Me Date: Tue, 9 Sep 2014 05:36:09 +0200 Subject: [PATCH] CheckNullPointer::isPointerDeRef: Improve handling of static member variables and functions --- lib/checknullpointer.cpp | 10 ++++++++++ test/testuninitvar.cpp | 24 ++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/lib/checknullpointer.cpp b/lib/checknullpointer.cpp index 545d91892..ea0ed9632 100644 --- a/lib/checknullpointer.cpp +++ b/lib/checknullpointer.cpp @@ -168,6 +168,16 @@ bool CheckNullPointer::isPointerDeRef(const Token *tok, bool &unknown) // read/write member variable if (firstOperand && parent->str() == "." && (!parent->astParent() || parent->astParent()->str() != "&")) { + const Token* rightTok = parent->astOperand2(); + if (rightTok) { + const Function* func = rightTok->function(); + if (func && func->isStatic) + return false; + const Variable* var = rightTok->variable(); + if (var && var->isStatic()) { + return false; + } + } if (!parent->astParent() || parent->astParent()->str() != "(" || parent->astParent() == tok->previous()) return true; unknown = true; diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 7be3831e4..b43723bd2 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -3173,6 +3173,30 @@ private: "}"); ASSERT_EQUALS("", errout.str()); + checkUninitVar2("class Element {\n" + " static int v;\n" + "};\n" + "void test() {\n" + " Element *element; element->v;\n" + "}"); + ASSERT_EQUALS("", errout.str()); + + checkUninitVar2("class Element {\n" + " void f() { }\n" + "};\n" + "void test() {\n" + " Element *element; element->f();\n" + "}"); + ASSERT_EQUALS("[test.cpp:5]: (error) Uninitialized variable: element\n", errout.str()); + + checkUninitVar2("class Element {\n" + " int v;\n" + "};\n" + "void test() {\n" + " Element *element; element->v;\n" + "}"); + ASSERT_EQUALS("[test.cpp:5]: (error) Uninitialized variable: element\n", errout.str()); + checkUninitVar2("void f() {\n" // #4911 - bad simplification => don't crash " int a;\n" " do { a=do_something() } while (a);\n"