Fixed #4367 (false positive: Class '...' is unsafe, '...' can leak by wrong usage)
This commit is contained in:
parent
5c7e1cf9ff
commit
2edf95a1b9
|
@ -2380,10 +2380,15 @@ void CheckMemoryLeakInClass::variable(const Scope *scope, const Token *tokVarnam
|
||||||
// Inspect member functions
|
// Inspect member functions
|
||||||
std::list<Function>::const_iterator func;
|
std::list<Function>::const_iterator func;
|
||||||
for (func = scope->functionList.begin(); func != scope->functionList.end(); ++func) {
|
for (func = scope->functionList.begin(); func != scope->functionList.end(); ++func) {
|
||||||
if (!func->hasBody)
|
|
||||||
continue;
|
|
||||||
const bool constructor = func->type == Function::eConstructor;
|
const bool constructor = func->type == Function::eConstructor;
|
||||||
const bool destructor = func->type == Function::eDestructor;
|
const bool destructor = func->type == Function::eDestructor;
|
||||||
|
if (!func->hasBody) {
|
||||||
|
if (destructor) { // implementation for destructor is not seen => assume it deallocates all variables properly
|
||||||
|
deallocInDestructor = true;
|
||||||
|
Dealloc = CheckMemoryLeak::Many;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
bool body = false;
|
bool body = false;
|
||||||
const Token *end = func->functionScope->classEnd;
|
const Token *end = func->functionScope->classEnd;
|
||||||
for (const Token *tok = func->arg->link(); tok != end; tok = tok->next()) {
|
for (const Token *tok = func->arg->link(); tok != end; tok = tok->next()) {
|
||||||
|
|
|
@ -3935,6 +3935,7 @@ private:
|
||||||
TEST_CASE(class22); // ticket #3012
|
TEST_CASE(class22); // ticket #3012
|
||||||
TEST_CASE(class23); // ticket #3303
|
TEST_CASE(class23); // ticket #3303
|
||||||
TEST_CASE(class24); // ticket #3806 - false positive in copy constructor
|
TEST_CASE(class24); // ticket #3806 - false positive in copy constructor
|
||||||
|
TEST_CASE(class25); // ticket #4367 - false positive implementation for destructor is not seen
|
||||||
|
|
||||||
TEST_CASE(staticvar);
|
TEST_CASE(staticvar);
|
||||||
|
|
||||||
|
@ -4848,6 +4849,17 @@ private:
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void class25() { // ticket #4367 - false positive when implementation for destructor is not seen
|
||||||
|
check("class Fred {\n"
|
||||||
|
"private:\n"
|
||||||
|
" int * a;\n"
|
||||||
|
"public:\n"
|
||||||
|
" Fred() { a = new int; }\n"
|
||||||
|
" ~Fred();\n"
|
||||||
|
"};\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
void staticvar() {
|
void staticvar() {
|
||||||
check("class A\n"
|
check("class A\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
|
|
Loading…
Reference in New Issue