diff --git a/lib/checkmemoryleak.cpp b/lib/checkmemoryleak.cpp index ded89267d..f4ec46db9 100644 --- a/lib/checkmemoryleak.cpp +++ b/lib/checkmemoryleak.cpp @@ -953,6 +953,11 @@ Token *CheckMemoryLeakInFunction::getcode(const Token *tok, std::list 0 && Token::Match(tok2, "! %varid%", varid)) + { + dep = true; + break; + } } if (Token::Match(tok, "if ( ! %varid% &&", varid)) @@ -969,6 +974,8 @@ Token *CheckMemoryLeakInFunction::getcode(const Token *tok, std::listnext()->link(); } } } @@ -1499,6 +1506,14 @@ void CheckMemoryLeakInFunction::simplifycode(Token *tok, bool &all) done = false; } + // Reduce "ifv return;" => "if return use;" + if (Token::simpleMatch(tok2, "ifv return ;")) + { + tok2->str("if"); + tok2->next()->insertToken("use"); + done = false; + } + // Reduce "if(var) dealloc ;" and "if(var) use ;" that is not followed by an else.. if (Token::Match(tok2, "[;{}] if(var) assign|dealloc|use ; !!else")) { diff --git a/test/testmemleak.cpp b/test/testmemleak.cpp index f42fa21f6..a32f48f88 100644 --- a/test/testmemleak.cpp +++ b/test/testmemleak.cpp @@ -254,7 +254,6 @@ private: TEST_CASE(ifelse9); TEST_CASE(ifelse10); - TEST_CASE(if1); TEST_CASE(if4); TEST_CASE(if7); // Bug 2401436 TEST_CASE(if8); // Bug 2458532 @@ -463,6 +462,7 @@ private: ASSERT_EQUALS(";;if(!var){}else{}", getcode("char *s; if (!s) { } else { }", "s")); ASSERT_EQUALS(";;if{}", getcode("char *s; if (a && s) { }", "s")); ASSERT_EQUALS(";;if(!var){}", getcode("char *s; if (a && !s) { }", "s")); + ASSERT_EQUALS(";;ifv{}", getcode("char *s; if (foo(!s)) { }", "s")); ASSERT_EQUALS(";;;if{dealloc;};if{dealloc;return;}assign;returnuse;", getcode("char *buf, *tmp; tmp = realloc(buf, 40); if (!(tmp)) { free(buf); return; } buf = tmp; return buf;", "buf")); // switch.. @@ -667,6 +667,7 @@ private: // if(var) ASSERT_EQUALS("; alloc ; return use ;", simplifycode("; alloc ; return use ;")); + ASSERT_EQUALS("; alloc ; return use ;", simplifycode("; alloc ; ifv return ; return use ;")); // switch.. ASSERT_EQUALS("; alloc ; dealloc ;", simplifycode(";alloc;switch{case;break;};dealloc;")); @@ -1019,21 +1020,6 @@ private: - - void if1() - { - check("void f()\n" - "{\n" - " struct abc *p = new abc;\n" - " p->a = new char[100];\n" - " if ( ! p->a )\n" - " return;\n" - " foo(p);\n" - "}\n"); - ASSERT_EQUALS("[test.cpp:6]: (error) Memory leak: p\n", errout.str()); - } - - void if4() { check("void f()\n" @@ -1125,7 +1111,7 @@ private: " }\n" " delete [] x;\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:6]: (error) Memory leak: x\n", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:6]: (error) Memory leak: x\n", errout.str()); }