refactoring: Refactoring of the leak-checking classes

This commit is contained in:
Daniel Marjamäki 2009-07-13 15:07:26 +02:00
parent f7cb7da560
commit 913789605f
2 changed files with 54 additions and 41 deletions

View File

@ -222,41 +222,67 @@ void CheckMemoryLeak::memoryLeak(const Token *tok, const char varname[], AllocTy
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
ErrorLogger::ErrorMessage CheckMemoryLeak::errmsg(const Token *tok, Severity::e severity, const std::string &id, const std::string &msg) const
{
ErrorLogger::ErrorMessage::FileLocation loc;
loc.line = tok->linenr();
loc.file = tokenizer->file(tok);
std::list<ErrorLogger::ErrorMessage::FileLocation> callstack;
callstack.push_back(loc);
return ErrorLogger::ErrorMessage(callstack, Severity::stringify(severity), msg, id);
}
ErrorLogger::ErrorMessage CheckMemoryLeak::errmsg(const std::list<const Token *> &callstack, Severity::e severity, const std::string &id, const std::string &msg) const
{
std::list<ErrorLogger::ErrorMessage::FileLocation> locations;
for (std::list<const Token *>::const_iterator it = callstack.begin(); it != callstack.end(); ++it)
{
ErrorLogger::ErrorMessage::FileLocation loc;
loc.line = (*it)->linenr();
loc.file = tokenizer->file(*it);
locations.push_back(loc);
}
return ErrorLogger::ErrorMessage(locations, Severity::stringify(severity), msg, id);
}
void CheckMemoryLeak::memleakError(const Token *tok, const std::string &varname) void CheckMemoryLeak::memleakError(const Token *tok, const std::string &varname)
{ {
error(tok, Severity::error, "memleak", "Memory leak: " + varname); errorLogger->reportErr(errmsg(tok, Severity::error, "memleak", "Memory leak: " + varname));
} }
void CheckMemoryLeak::memleakallError(const Token *tok, const std::string &varname) void CheckMemoryLeak::memleakallError(const Token *tok, const std::string &varname)
{ {
error(tok, Severity::possibleError, "memleakall", "Memory leak: " + varname); errorLogger->reportErr(errmsg(tok, Severity::possibleError, "memleakall", "Memory leak: " + varname));
} }
void CheckMemoryLeak::resourceLeakError(const Token *tok, const std::string &varname) void CheckMemoryLeak::resourceLeakError(const Token *tok, const std::string &varname)
{ {
error(tok, Severity::error, "resourceLeak", "Resource leak: " + varname); errorLogger->reportErr(errmsg(tok, Severity::error, "resourceLeak", "Resource leak: " + varname));
} }
void CheckMemoryLeak::deallocDeallocError(const Token *tok, const std::string &varname) void CheckMemoryLeak::deallocDeallocError(const Token *tok, const std::string &varname)
{ {
error(tok, Severity::error, "deallocDealloc", "Deallocating a deallocated pointer: " + varname); errorLogger->reportErr(errmsg(tok, Severity::error, "deallocDealloc", "Deallocating a deallocated pointer: " + varname));
} }
void CheckMemoryLeak::deallocuseError(const Token *tok, const std::string &varname) void CheckMemoryLeak::deallocuseError(const Token *tok, const std::string &varname)
{ {
error(tok, Severity::error, "deallocuse", "Using '" + varname + "' after it is deallocated / released"); errorLogger->reportErr(errmsg(tok, Severity::error, "deallocuse", "Using '" + varname + "' after it is deallocated / released"));
} }
void CheckMemoryLeak::mismatchSizeError(const Token *tok, const std::string &sz) void CheckMemoryLeak::mismatchSizeError(const Token *tok, const std::string &sz)
{ {
error(tok, Severity::error, "mismatchSize", "The given size " + sz + " is mismatching"); errorLogger->reportErr(errmsg(tok, Severity::error, "mismatchSize", "The given size " + sz + " is mismatching"));
} }
void CheckMemoryLeak::mismatchAllocDealloc(const std::list<const Token *> &callstack, const std::string &varname) void CheckMemoryLeak::mismatchAllocDealloc(const std::list<const Token *> &callstack, const std::string &varname)
{ {
error(callstack, Severity::error, "mismatchAllocDealloc", "Mismatching allocation and deallocation: " + varname); errorLogger->reportErr(errmsg(callstack, Severity::error, "mismatchAllocDealloc", "Mismatching allocation and deallocation: " + varname));
} }
CheckMemoryLeak::AllocType CheckMemoryLeak::functionReturnType(const Token *tok) const CheckMemoryLeak::AllocType CheckMemoryLeak::functionReturnType(const Token *tok) const

View File

@ -43,8 +43,19 @@ class Token;
class CheckMemoryLeak class CheckMemoryLeak
{ {
private:
const Tokenizer * const tokenizer;
ErrorLogger * const errorLogger;
ErrorLogger::ErrorMessage errmsg(const Token *tok, Severity::e severity, const std::string &id, const std::string &msg) const;
ErrorLogger::ErrorMessage errmsg(const std::list<const Token *> &callstack, Severity::e severity, const std::string &id, const std::string &msg) const;
public: public:
CheckMemoryLeak() { } CheckMemoryLeak(const Tokenizer *t, ErrorLogger *e)
: tokenizer(t), errorLogger(e)
{
}
/** What type of allocation are used.. the "Many" means that several types of allocation and deallocation are used */ /** What type of allocation are used.. the "Many" means that several types of allocation and deallocation are used */
enum AllocType { No, Malloc, gMalloc, New, NewArray, File, Fd, Pipe, Dir, Many }; enum AllocType { No, Malloc, gMalloc, New, NewArray, File, Fd, Pipe, Dir, Many };
@ -64,10 +75,6 @@ public:
void mismatchSizeError(const Token *tok, const std::string &sz); void mismatchSizeError(const Token *tok, const std::string &sz);
void mismatchAllocDealloc(const std::list<const Token *> &callstack, const std::string &varname); void mismatchAllocDealloc(const std::list<const Token *> &callstack, const std::string &varname);
// error message
virtual void error(const Token *tok, const Severity::e severity, const std::string &id, const std::string &msg) = 0;
virtual void error(const std::list<const Token *> &callstack, const Severity::e severity, const std::string &id, const std::string &msg) = 0;
/** What type of allocated memory does the given function return? */ /** What type of allocated memory does the given function return? */
AllocType functionReturnType(const Token *tok) const; AllocType functionReturnType(const Token *tok) const;
}; };
@ -84,14 +91,14 @@ public:
* 4. finally, check if the simplified token list contain any leaks. * 4. finally, check if the simplified token list contain any leaks.
*/ */
class CheckMemoryLeakInFunction : public CheckMemoryLeak, public Check class CheckMemoryLeakInFunction : public Check, private CheckMemoryLeak
{ {
public: public:
CheckMemoryLeakInFunction() : Check() CheckMemoryLeakInFunction() : Check(), CheckMemoryLeak(0, 0)
{ } { }
CheckMemoryLeakInFunction(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) CheckMemoryLeakInFunction(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger)
: Check(tokenizer, settings, errorLogger) : Check(tokenizer, settings, errorLogger), CheckMemoryLeak(tokenizer, errorLogger)
{ } { }
void runSimplifiedChecks(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) void runSimplifiedChecks(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger)
@ -141,16 +148,6 @@ private:
void checkScope(const Token *Tok1, const char varname[], bool classmember, unsigned int sz); void checkScope(const Token *Tok1, const char varname[], bool classmember, unsigned int sz);
void error(const Token *tok, const Severity::e severity, const std::string &id, const std::string &msg)
{
reportError(tok, severity, id, msg);
}
void error(const std::list<const Token *> &callstack, const Severity::e severity, const std::string &id, const std::string &msg)
{
reportError(callstack, severity, id, msg);
}
void getErrorMessages() void getErrorMessages()
{ } { }
@ -172,14 +169,14 @@ private:
* variables that are allocated in the constructor should be deallocated in the destructor * variables that are allocated in the constructor should be deallocated in the destructor
*/ */
class CheckMemoryLeakInClass : public CheckMemoryLeak, public Check class CheckMemoryLeakInClass : public Check, private CheckMemoryLeak
{ {
public: public:
CheckMemoryLeakInClass() : Check() CheckMemoryLeakInClass() : Check(), CheckMemoryLeak(0,0)
{ } { }
CheckMemoryLeakInClass(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) CheckMemoryLeakInClass(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger)
: Check(tokenizer, settings, errorLogger) : Check(tokenizer, settings, errorLogger), CheckMemoryLeak(tokenizer, errorLogger)
{ } { }
void runSimplifiedChecks(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) void runSimplifiedChecks(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger)
@ -197,16 +194,6 @@ private:
void parseClass(const Token *tok1, std::vector<const char *> &classname); void parseClass(const Token *tok1, std::vector<const char *> &classname);
void variable(const char classname[], const Token *tokVarname); void variable(const char classname[], const Token *tokVarname);
void error(const Token *tok, const Severity::e severity, const std::string &id, const std::string &msg)
{
reportError(tok, severity, id, msg);
}
void error(const std::list<const Token *> &callstack, const Severity::e severity, const std::string &id, const std::string &msg)
{
reportError(callstack, severity, id, msg);
}
void getErrorMessages() void getErrorMessages()
{ } { }
@ -228,14 +215,14 @@ private:
* variables that are allocated in the constructor should be deallocated in the destructor * variables that are allocated in the constructor should be deallocated in the destructor
*/ */
class CheckMemoryLeakStructMember : public CheckMemoryLeak, public Check class CheckMemoryLeakStructMember : public Check, private CheckMemoryLeak
{ {
public: public:
CheckMemoryLeakStructMember() : Check() CheckMemoryLeakStructMember() : Check(), CheckMemoryLeak(0,0)
{ } { }
CheckMemoryLeakStructMember(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) CheckMemoryLeakStructMember(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger)
: Check(tokenizer, settings, errorLogger) : Check(tokenizer, settings, errorLogger), CheckMemoryLeak(tokenizer, errorLogger)
{ } { }
void runSimplifiedChecks(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) void runSimplifiedChecks(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger)