From 4064712baa8b26437ffd8cb620decba18fb162e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sat, 11 Sep 2010 20:49:24 +0200 Subject: [PATCH] Memory leaks: improved simplification for 'callfunc' --- lib/checkmemoryleak.cpp | 32 +++++++++++++++++--------------- test/testmemleak.cpp | 5 +++-- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/lib/checkmemoryleak.cpp b/lib/checkmemoryleak.cpp index 0663b41ba..f4d56be17 100644 --- a/lib/checkmemoryleak.cpp +++ b/lib/checkmemoryleak.cpp @@ -1492,21 +1492,6 @@ void CheckMemoryLeakInFunction::simplifycode(Token *tok) tok2->str("return"); } - // reduce "if callfunc {" => "if {" - for (Token *tok2 = tok; tok2; tok2 = tok2->next()) - { - if (Token::Match(tok2, "if|ifv callfunc {")) - tok2->deleteNext(); - } - - // reduce "; callfunc ; %var%" - for (Token *tok2 = tok; tok2; tok2 = tok2->next()) - { - if (Token::Match(tok2, ";|{|} callfunc ; %type%") || - Token::Match(tok2, ";|{|} callfunc ; ;")) - tok2->deleteNext(); - } - // remove redundant braces.. for (Token *start = tok; start; start = start->next()) { @@ -1542,6 +1527,16 @@ void CheckMemoryLeakInFunction::simplifycode(Token *tok) //tok->printOut("simplifycode loop.."); done = true; + // reduce callfunc + for (Token *tok2 = tok; tok2; tok2 = tok2->next()) + { + if (tok2->str() == "callfunc") + { + if (!Token::Match(tok2->previous(), "[;{}] callfunc ; }")) + tok2->deleteThis(); + } + } + // simplify "while1" contents.. for (Token *tok2 = tok; tok2; tok2 = tok2->next()) { @@ -1950,6 +1945,13 @@ void CheckMemoryLeakInFunction::simplifycode(Token *tok) done = false; } + // callfunc callfunc + while (Token::simpleMatch(tok2, "callfunc callfunc")) + { + tok2->deleteNext(); + done = false; + } + // Delete second case in "case ; case ;" while (Token::simpleMatch(tok2, "case ; case ;")) { diff --git a/test/testmemleak.cpp b/test/testmemleak.cpp index c1824d41e..f6ed93865 100644 --- a/test/testmemleak.cpp +++ b/test/testmemleak.cpp @@ -725,10 +725,11 @@ private: TODO_ASSERT_EQUALS("; assign ; if alloc ; }", simplifycode("; assign ; { dealloc ; if alloc ; } }")); // callfunc.. - ASSERT_EQUALS("; callfunc ;", simplifycode(";callfunc;")); + ASSERT_EQUALS("; callfunc ; }", simplifycode(";callfunc;}")); ASSERT_EQUALS(";", simplifycode(";callfunc;;")); + ASSERT_EQUALS("; callfunc ; }", simplifycode(";callfunc callfunc ; }")); ASSERT_EQUALS("dealloc ; alloc ; return ; }", simplifycode("while1 { dealloc ; alloc ; } callfunc ; return ; }")); - ASSERT_EQUALS(";", simplifycode("loop callfunc ;")); + ASSERT_EQUALS("; }", simplifycode("loop callfunc ; }")); // exit.. ASSERT_EQUALS("; exit ;", simplifycode("; alloc; exit;"));