From 527236b3217f532b5fec84dbb97a08b334ad53d6 Mon Sep 17 00:00:00 2001 From: Richard Quirk Date: Sun, 13 Nov 2011 22:35:13 +0100 Subject: [PATCH] Fix false positives for delete of known nulls --- lib/checknullpointer.cpp | 4 ++++ test/testnullpointer.cpp | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/lib/checknullpointer.cpp b/lib/checknullpointer.cpp index 7069c15dc..fe0d571cf 100644 --- a/lib/checknullpointer.cpp +++ b/lib/checknullpointer.cpp @@ -217,6 +217,10 @@ bool CheckNullPointer::isPointerDeRef(const Token *tok, bool &unknown) if (Token::Match(tok->previous(), "[;{}] %var% =")) return false; + // OK to delete a null + if (Token::Match(tok->previous(), "delete %var%") || Token::Match(tok->tokAt(-3), "delete [ ] %var%")) + return false; + // unknown if it's a dereference unknown = true; diff --git a/test/testnullpointer.cpp b/test/testnullpointer.cpp index 3893815f9..1f1f77182 100644 --- a/test/testnullpointer.cpp +++ b/test/testnullpointer.cpp @@ -57,6 +57,7 @@ private: TEST_CASE(nullpointer_in_return); TEST_CASE(nullpointer_in_typeid); TEST_CASE(nullpointer_in_for_loop); + TEST_CASE(nullpointerDelete); } void check(const char code[], bool inconclusive = false, bool cpp11 = false) { @@ -1587,6 +1588,25 @@ private: "}"); ASSERT_EQUALS("", errout.str()); } + + void nullpointerDelete() { + check("void f() {\n" + " K *k = getK();\n" + " if (k)\n" + " k->doStuff();\n" + " delete k;\n" + "}\n", true); + ASSERT_EQUALS("", errout.str()); + + check("void f() {\n" + " K *k = getK();\n" + " if (k)\n" + " k[0] = ptr;\n" + " delete [] k;\n" + " k = new K[10];\n" + "}\n", true); + ASSERT_EQUALS("", errout.str()); + } }; REGISTER_TEST(TestNullPointer)