Memoryleak: fopen and popen report now "Resource leak" instead of "Memory leak"

This commit is contained in:
Reijo Tomperi 2008-12-12 19:08:30 +00:00
parent 4f8ab7fa03
commit edff8d326f
2 changed files with 17 additions and 9 deletions

View File

@ -278,10 +278,18 @@ void CheckMemoryLeakClass::MismatchError( const TOKEN *Tok1, const std::list<con
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
void CheckMemoryLeakClass::MemoryLeak( const TOKEN *tok, const char varname[] ) void CheckMemoryLeakClass::MemoryLeak( const TOKEN *tok, const char varname[], AllocType alloctype )
{ {
std::ostringstream errmsg; std::ostringstream errmsg;
errmsg << _tokenizer->fileLine(tok) << ": Memory leak: " << varname; errmsg << _tokenizer->fileLine(tok);
if( alloctype == CheckMemoryLeakClass::FOPEN ||
alloctype == CheckMemoryLeakClass::POPEN )
errmsg << ": Resource leak: ";
else
errmsg << ": Memory leak: ";
errmsg << varname;
_errorLogger->reportErr( errmsg.str() ); _errorLogger->reportErr( errmsg.str() );
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@ -975,23 +983,23 @@ void CheckMemoryLeakClass::CheckMemoryLeak_CheckScope( const TOKEN *Tok1, const
const TOKEN *result; const TOKEN *result;
if ( (result = TOKEN::findmatch(tok, "loop alloc ;")) != NULL ) if ( (result = TOKEN::findmatch(tok, "loop alloc ;")) != NULL )
{ {
MemoryLeak(result, varname); MemoryLeak(result, varname, alloctype);
} }
else if ( (result = TOKEN::findmatch(tok, "alloc ; if break|continue|return ;")) != NULL ) else if ( (result = TOKEN::findmatch(tok, "alloc ; if break|continue|return ;")) != NULL )
{ {
// MemoryLeak(Tokenizer::gettok(TOKEN::findmatch(tok, "alloc ; if continue ;"), 3), varname); // MemoryLeak(Tokenizer::gettok(TOKEN::findmatch(tok, "alloc ; if continue ;"), 3), varname);
MemoryLeak(result->tokAt(3), varname); MemoryLeak(result->tokAt(3), varname, alloctype);
} }
else if ( _settings._showAll && (result = TOKEN::findmatch(tok, "alloc ; ifv break|continue|return ;")) != NULL ) else if ( _settings._showAll && (result = TOKEN::findmatch(tok, "alloc ; ifv break|continue|return ;")) != NULL )
{ {
MemoryLeak(result->tokAt(3), varname); MemoryLeak(result->tokAt(3), varname, alloctype);
} }
else if ( (result = TOKEN::findmatch(tok, "alloc ; alloc|assign|return ;")) != NULL ) else if ( (result = TOKEN::findmatch(tok, "alloc ; alloc|assign|return ;")) != NULL )
{ {
MemoryLeak(result->tokAt(2), varname); MemoryLeak(result->tokAt(2), varname, alloctype);
} }
else if ( ! TOKEN::findmatch(tok,"dealloc") && else if ( ! TOKEN::findmatch(tok,"dealloc") &&
@ -1001,7 +1009,7 @@ void CheckMemoryLeakClass::CheckMemoryLeak_CheckScope( const TOKEN *Tok1, const
const TOKEN *last = tok; const TOKEN *last = tok;
while (last->next()) while (last->next())
last = last->next(); last = last->next();
MemoryLeak(last, varname); MemoryLeak(last, varname, alloctype);
} }
// detect cases that "simplifycode" don't handle well.. // detect cases that "simplifycode" don't handle well..
@ -1242,7 +1250,7 @@ void CheckMemoryLeakClass::CheckMemoryLeak_ClassMembers_Variable( const std::vec
if ( Alloc != No && Dealloc == No ) if ( Alloc != No && Dealloc == No )
{ {
MemoryLeak( _tokenizer->tokens(), FullVariableName.str().c_str() ); MemoryLeak( _tokenizer->tokens(), FullVariableName.str().c_str(), Alloc );
} }
} }

View File

@ -90,7 +90,7 @@ private:
TOKEN *getcode(const TOKEN *tok, std::list<const TOKEN *> callstack, const char varname[], AllocType &alloctype, AllocType &dealloctype); TOKEN *getcode(const TOKEN *tok, std::list<const TOKEN *> callstack, const char varname[], AllocType &alloctype, AllocType &dealloctype);
bool notvar(const TOKEN *tok, const char *varnames[]); bool notvar(const TOKEN *tok, const char *varnames[]);
void instoken(TOKEN *tok, const char str[]); void instoken(TOKEN *tok, const char str[]);
void MemoryLeak( const TOKEN *tok, const char varname[] ); void MemoryLeak( const TOKEN *tok, const char varname[], AllocType alloctype );
void MismatchError( const TOKEN *Tok1, const std::list<const TOKEN *> &callstack, const char varname[] ); void MismatchError( const TOKEN *Tok1, const std::list<const TOKEN *> &callstack, const char varname[] );
const char * call_func( const TOKEN *tok, std::list<const TOKEN *> callstack, const char *varnames[], AllocType &alloctype, AllocType &dealloctype ); const char * call_func( const TOKEN *tok, std::list<const TOKEN *> callstack, const char *varnames[], AllocType &alloctype, AllocType &dealloctype );
AllocType GetDeallocationType( const TOKEN *tok, const char *varnames[]); AllocType GetDeallocationType( const TOKEN *tok, const char *varnames[]);