From 62f92fe253bf22dc3bfc9d5f5f055f7bc0224a3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sun, 17 Jun 2012 07:54:24 +0200 Subject: [PATCH] Fixed #3866 (false positive: memory leak (UNLIKELY)) --- lib/checkleakautovar.cpp | 5 ++++- test/testleakautovar.cpp | 8 ++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/checkleakautovar.cpp b/lib/checkleakautovar.cpp index b620374a2..acb29749b 100644 --- a/lib/checkleakautovar.cpp +++ b/lib/checkleakautovar.cpp @@ -302,8 +302,11 @@ void CheckLeakAutoVar::checkScope(const Token * const startToken, varInfo2.erase(tok->tokAt(2)->varId()); if (notzero.find(tok->tokAt(2)->varId()) != notzero.end()) varInfo2.clear(); - } else if (Token::Match(tok->next(), "( ! %var% )|&&")) + } else if (Token::Match(tok->next(), "( ! %var% )|&&")) { varInfo1.erase(tok->tokAt(3)->varId()); + } else if (Token::Match(tok->next(), "( %var% ( ! %var% ) )|&&")) { + varInfo1.erase(tok->tokAt(5)->varId()); + } checkScope(tok2->next(), &varInfo1, notzero); tok2 = tok2->linkAt(1); diff --git a/test/testleakautovar.cpp b/test/testleakautovar.cpp index e9e6b0f35..bfebd5d0f 100644 --- a/test/testleakautovar.cpp +++ b/test/testleakautovar.cpp @@ -299,6 +299,14 @@ private: " free(p);\n" "}"); ASSERT_EQUALS("", errout.str()); + + // #3866 - UNLIKELY + check("void f() {\n" + " char *p = malloc(10);\n" + " if (UNLIKELY(!p)) { return; }\n" + " free(p);\n" + "}"); + ASSERT_EQUALS("", errout.str()); } void ifelse4() {