Ticket #6648: Properly handle variables that have been deallocated and whose _address_ is taken after in CheckLeakAutoVar.
This commit is contained in:
parent
f1f46611d6
commit
fa94f2e0f4
|
@ -160,7 +160,7 @@ void CheckLeakAutoVar::checkScope(const Token * const startToken,
|
||||||
if (tok->varId() > 0) {
|
if (tok->varId() > 0) {
|
||||||
const std::map<unsigned int, VarInfo::AllocInfo>::const_iterator var = alloctype.find(tok->varId());
|
const std::map<unsigned int, VarInfo::AllocInfo>::const_iterator var = alloctype.find(tok->varId());
|
||||||
if (var != alloctype.end()) {
|
if (var != alloctype.end()) {
|
||||||
if (var->second.status == VarInfo::DEALLOC && (!Token::Match(tok, "%name% =") || tok->strAt(-1) == "*")) {
|
if (var->second.status == VarInfo::DEALLOC && tok->strAt(-1) != "&" && (!Token::Match(tok, "%name% =") || tok->strAt(-1) == "*")) {
|
||||||
deallocUseError(tok, tok->str());
|
deallocUseError(tok, tok->str());
|
||||||
} else if (Token::simpleMatch(tok->tokAt(-2), "= &")) {
|
} else if (Token::simpleMatch(tok->tokAt(-2), "= &")) {
|
||||||
varInfo->erase(tok->varId());
|
varInfo->erase(tok->varId());
|
||||||
|
|
|
@ -314,7 +314,7 @@ private:
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void deallocuse7() { // #6467, #6469, #6473
|
void deallocuse7() { // #6467, #6469, #6473, #6648
|
||||||
check("struct Foo { int* ptr; };\n"
|
check("struct Foo { int* ptr; };\n"
|
||||||
"void f(Foo* foo) {\n"
|
"void f(Foo* foo) {\n"
|
||||||
" delete foo->ptr;\n"
|
" delete foo->ptr;\n"
|
||||||
|
@ -349,6 +349,13 @@ private:
|
||||||
" foo->ptr->func();\n"
|
" foo->ptr->func();\n"
|
||||||
"}", true);
|
"}", true);
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
check("void foo(void (*conv)(char**)) {\n"
|
||||||
|
" char * ptr=(char*)malloc(42);\n"
|
||||||
|
" free(ptr);\n"
|
||||||
|
" (*conv)(&ptr);\n"
|
||||||
|
"}");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void doublefree1() { // #3895
|
void doublefree1() { // #3895
|
||||||
|
|
Loading…
Reference in New Issue