Merge pull request #152 from simartin/ticket_4914
Fixed #4914 (memory freed twice, when in do {} while being shortcircuited via continue)
This commit is contained in:
commit
862eb351d5
|
@ -370,6 +370,11 @@ void CheckLeakAutoVar::checkScope(const Token * const startToken,
|
||||||
else if (tok->str() == "goto") {
|
else if (tok->str() == "goto") {
|
||||||
varInfo->clear();
|
varInfo->clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// continue/break
|
||||||
|
else if (Token::Match(tok, "continue|break ;")) {
|
||||||
|
varInfo->clear();
|
||||||
|
}
|
||||||
|
|
||||||
// throw
|
// throw
|
||||||
// TODO: if the execution leave the function then treat it as return
|
// TODO: if the execution leave the function then treat it as return
|
||||||
|
|
|
@ -56,6 +56,7 @@ private:
|
||||||
|
|
||||||
TEST_CASE(doublefree1);
|
TEST_CASE(doublefree1);
|
||||||
TEST_CASE(doublefree2);
|
TEST_CASE(doublefree2);
|
||||||
|
TEST_CASE(doublefree3); // #4914
|
||||||
|
|
||||||
// exit
|
// exit
|
||||||
TEST_CASE(exit1);
|
TEST_CASE(exit1);
|
||||||
|
@ -327,6 +328,24 @@ private:
|
||||||
"}");
|
"}");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void doublefree3() { // #4914
|
||||||
|
check("void foo() {\n"
|
||||||
|
" bool done = false;\n"
|
||||||
|
" do {\n"
|
||||||
|
" char *bar = malloc(10)\n"
|
||||||
|
" if(condition()) {\n"
|
||||||
|
" free(bar);\n"
|
||||||
|
" continue;\n"
|
||||||
|
" }\n"
|
||||||
|
" done = true;\n"
|
||||||
|
" free(bar)\n"
|
||||||
|
" } while(!done);\n"
|
||||||
|
" return;"
|
||||||
|
"}"
|
||||||
|
);
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
void exit1() {
|
void exit1() {
|
||||||
check("void f() {\n"
|
check("void f() {\n"
|
||||||
|
|
Loading…
Reference in New Issue