Fixed #7845 (Leak reported when ignoring return value of 'new', even if pointer saved by constructor)
This commit is contained in:
parent
ae001d4336
commit
a4406aca32
@ -142,6 +142,14 @@ CheckMemoryLeak::AllocType CheckMemoryLeak::getAllocationType(const Token *tok2,
|
|||||||
return No;
|
return No;
|
||||||
if (tok2->astOperand1() && (tok2->astOperand1()->str() == "[" || (tok2->astOperand1()->astOperand1() && tok2->astOperand1()->astOperand1()->str() == "[")))
|
if (tok2->astOperand1() && (tok2->astOperand1()->str() == "[" || (tok2->astOperand1()->astOperand1() && tok2->astOperand1()->astOperand1()->str() == "[")))
|
||||||
return NewArray;
|
return NewArray;
|
||||||
|
const Token *typeTok = tok2->next();
|
||||||
|
while (Token::Match(typeTok, "%name% :: %name%"))
|
||||||
|
typeTok = typeTok->tokAt(2);
|
||||||
|
if (typeTok->type() && typeTok->type()->isClassType()) {
|
||||||
|
const Scope *classScope = typeTok->type()->classScope;
|
||||||
|
if (classScope && classScope->numConstructors > 0)
|
||||||
|
return No;
|
||||||
|
}
|
||||||
return New;
|
return New;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1804,6 +1804,9 @@ private:
|
|||||||
// pass allocated memory to function using a smart pointer
|
// pass allocated memory to function using a smart pointer
|
||||||
TEST_CASE(smartPointerFunctionParam);
|
TEST_CASE(smartPointerFunctionParam);
|
||||||
TEST_CASE(resourceLeak);
|
TEST_CASE(resourceLeak);
|
||||||
|
|
||||||
|
// Test getAllocationType for subfunction
|
||||||
|
TEST_CASE(getAllocationType);
|
||||||
}
|
}
|
||||||
|
|
||||||
void functionParameter() {
|
void functionParameter() {
|
||||||
@ -2087,6 +2090,17 @@ private:
|
|||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void getAllocationType() {
|
||||||
|
// #7845
|
||||||
|
check("class Thing { Thing(); };\n"
|
||||||
|
"Thing * makeThing() { Thing *thing = new Thing; return thing; }\n"
|
||||||
|
"\n"
|
||||||
|
"void f() {\n"
|
||||||
|
" makeThing();\n"
|
||||||
|
"}");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
}
|
||||||
};
|
};
|
||||||
REGISTER_TEST(TestMemleakNoVar)
|
REGISTER_TEST(TestMemleakNoVar)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user