diff --git a/lib/checkmemoryleak.cpp b/lib/checkmemoryleak.cpp index 3d46ee4e3..ca6471d0d 100644 --- a/lib/checkmemoryleak.cpp +++ b/lib/checkmemoryleak.cpp @@ -1915,8 +1915,9 @@ void CheckMemoryLeakInFunction::simplifycode(Token *tok) done = false; } - // Remove "if { dealloc ; callfunc ; } !!else" - else if (Token::Match(tok2->next(), "if { dealloc|assign ; callfunc ; } !!else")) + // Remove "if { dealloc ; callfunc ; } !!else|return" + else if (Token::Match(tok2->next(), "if { dealloc|assign ; callfunc ; }") && + !Token::Match(tok2->tokAt(8), "else|return")) { Token::eraseTokens(tok2, tok2->tokAt(8)); done = false; diff --git a/test/testmemleak.cpp b/test/testmemleak.cpp index 63321a733..2b87d7f15 100644 --- a/test/testmemleak.cpp +++ b/test/testmemleak.cpp @@ -738,6 +738,10 @@ private: ASSERT_EQUALS("dealloc ; alloc ; return ; }", simplifycode("while1 { dealloc ; alloc ; } callfunc ; return ; }")); ASSERT_EQUALS("; }", simplifycode("loop callfunc ; }")); + // #2900 - don't report false positive + ASSERT_EQUALS("; alloc ; if { if { dealloc ; callfunc ; } return ; } dealloc ; }", + simplifycode("; alloc ; if { if { dealloc ; callfunc ; } return ; } dealloc ; }")); + // exit.. ASSERT_EQUALS("; exit ;", simplifycode("; alloc; exit;")); ASSERT_EQUALS("; exit ;", simplifycode("; alloc; if { loop ; } dealloc; exit;"));