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() {