refactoring error messages
This commit is contained in:
parent
262d182f26
commit
6fc66d3e2c
17
src/check.h
17
src/check.h
|
@ -72,15 +72,26 @@ protected:
|
||||||
/** report an error */
|
/** report an error */
|
||||||
void reportError(const Token *tok, const std::string severity, const std::string id, const std::string msg)
|
void reportError(const Token *tok, const std::string severity, const std::string id, const std::string msg)
|
||||||
{
|
{
|
||||||
ErrorLogger::ErrorMessage::FileLocation loc;
|
std::list<const Token *> callstack;
|
||||||
loc.line = tok->linenr();
|
callstack.push_back(tok);
|
||||||
loc.file = _tokenizer->file(tok);
|
reportError(callstack, severity, id, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** report an error */
|
||||||
|
void reportError(const std::list<const Token *> callstack, const std::string severity, const std::string id, const std::string msg)
|
||||||
|
{
|
||||||
std::list<ErrorLogger::ErrorMessage::FileLocation> locationList;
|
std::list<ErrorLogger::ErrorMessage::FileLocation> locationList;
|
||||||
|
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);
|
||||||
locationList.push_back(loc);
|
locationList.push_back(loc);
|
||||||
|
}
|
||||||
|
|
||||||
_errorLogger->reportErr(ErrorLogger::ErrorMessage(locationList, severity, msg, id));
|
_errorLogger->reportErr(ErrorLogger::ErrorMessage(locationList, severity, msg, id));
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -189,22 +189,25 @@ void CheckAutoVariables::autoVariables()
|
||||||
else if (bindent > 0 && Token::Match(tok, "%var% = & %var%")) //Critical assignement
|
else if (bindent > 0 && Token::Match(tok, "%var% = & %var%")) //Critical assignement
|
||||||
{
|
{
|
||||||
if (error_av(tok->tokAt(0), tok->tokAt(3)))
|
if (error_av(tok->tokAt(0), tok->tokAt(3)))
|
||||||
_errorLogger->genericError(_tokenizer,
|
reportError(tok,
|
||||||
tok,
|
"error",
|
||||||
|
"autoVariables",
|
||||||
"Wrong assignement of an auto-variable to an effective parameter of a function");
|
"Wrong assignement of an auto-variable to an effective parameter of a function");
|
||||||
}
|
}
|
||||||
else if (bindent > 0 && Token::Match(tok, "%var% [ %any% ] = & %var%")) //Critical assignement
|
else if (bindent > 0 && Token::Match(tok, "%var% [ %any% ] = & %var%")) //Critical assignement
|
||||||
{
|
{
|
||||||
if (error_av(tok->tokAt(0), tok->tokAt(6)))
|
if (error_av(tok->tokAt(0), tok->tokAt(6)))
|
||||||
_errorLogger->genericError(_tokenizer,
|
reportError(tok,
|
||||||
tok,
|
"error",
|
||||||
|
"autoVariables",
|
||||||
"Wrong assignement of an auto-variable to an effective parameter of a function");
|
"Wrong assignement of an auto-variable to an effective parameter of a function");
|
||||||
}
|
}
|
||||||
else if (bindent > 0 && Token::Match(tok, "return & %var%")) //Critical return
|
else if (bindent > 0 && Token::Match(tok, "return & %var%")) //Critical return
|
||||||
{
|
{
|
||||||
if (is_auto_var(tok->tokAt(2)))
|
if (is_auto_var(tok->tokAt(2)))
|
||||||
_errorLogger->genericError(_tokenizer,
|
reportError(tok,
|
||||||
tok,
|
"error",
|
||||||
|
"autoVariables",
|
||||||
"Return of the address of an auto-variable");
|
"Return of the address of an auto-variable");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,9 +47,30 @@ CheckBufferOverrunClass instance;
|
||||||
void CheckBufferOverrunClass::arrayIndexOutOfBounds(const Token *tok)
|
void CheckBufferOverrunClass::arrayIndexOutOfBounds(const Token *tok)
|
||||||
{
|
{
|
||||||
_callStack.push_back(tok);
|
_callStack.push_back(tok);
|
||||||
_errorLogger->arrayIndexOutOfBounds(_tokenizer, _callStack);
|
arrayIndexOutOfBounds();
|
||||||
_callStack.pop_back();
|
_callStack.pop_back();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CheckBufferOverrunClass::arrayIndexOutOfBounds()
|
||||||
|
{
|
||||||
|
reportError(_callStack, "all", "arrayIndexOutOfBounds", "Array index out of bounds");
|
||||||
|
}
|
||||||
|
|
||||||
|
void CheckBufferOverrunClass::bufferOverrun(const Token *tok)
|
||||||
|
{
|
||||||
|
reportError(tok, "all", "bufferOverrun", "Buffer overrun");
|
||||||
|
}
|
||||||
|
|
||||||
|
void CheckBufferOverrunClass::strncatUsage(const Token *tok)
|
||||||
|
{
|
||||||
|
reportError(tok, "all", "strncatUsage", "Dangerous usage of strncat, possible buffer overrun");
|
||||||
|
}
|
||||||
|
|
||||||
|
void CheckBufferOverrunClass::outOfBounds(const Token *tok, const std::string &what)
|
||||||
|
{
|
||||||
|
reportError(tok, "error", "outOfBounds", what + " is out of bounds");
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
@ -148,7 +169,7 @@ void CheckBufferOverrunClass::CheckBufferOverrun_CheckScope(const Token *tok, co
|
||||||
const char *num = tok->strAt(6);
|
const char *num = tok->strAt(6);
|
||||||
if (std::atoi(num) > total_size)
|
if (std::atoi(num) > total_size)
|
||||||
{
|
{
|
||||||
_errorLogger->bufferOverrun(_tokenizer, tok);
|
bufferOverrun(tok);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -161,7 +182,7 @@ void CheckBufferOverrunClass::CheckBufferOverrun_CheckScope(const Token *tok, co
|
||||||
const char *num = tok->strAt(varc + 6);
|
const char *num = tok->strAt(varc + 6);
|
||||||
if (std::atoi(num) > total_size)
|
if (std::atoi(num) > total_size)
|
||||||
{
|
{
|
||||||
_errorLogger->bufferOverrun(_tokenizer, tok);
|
bufferOverrun(tok);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
|
@ -220,7 +241,7 @@ void CheckBufferOverrunClass::CheckBufferOverrun_CheckScope(const Token *tok, co
|
||||||
|
|
||||||
if (Token::Match(tok2, pattern.str().c_str()))
|
if (Token::Match(tok2, pattern.str().c_str()))
|
||||||
{
|
{
|
||||||
_errorLogger->bufferOverrun(_tokenizer, tok2);
|
bufferOverrun(tok2);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -243,7 +264,7 @@ void CheckBufferOverrunClass::CheckBufferOverrun_CheckScope(const Token *tok, co
|
||||||
}
|
}
|
||||||
if (len > 2 && len >= (int)size + 2)
|
if (len > 2 && len >= (int)size + 2)
|
||||||
{
|
{
|
||||||
_errorLogger->bufferOverrun(_tokenizer, tok);
|
bufferOverrun(tok);
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -254,7 +275,7 @@ void CheckBufferOverrunClass::CheckBufferOverrun_CheckScope(const Token *tok, co
|
||||||
{
|
{
|
||||||
int n = atoi(tok->strAt(6));
|
int n = atoi(tok->strAt(6));
|
||||||
if (n == size)
|
if (n == size)
|
||||||
_errorLogger->strncatUsage(_tokenizer, tok);
|
strncatUsage(tok);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -263,7 +284,7 @@ void CheckBufferOverrunClass::CheckBufferOverrun_CheckScope(const Token *tok, co
|
||||||
{
|
{
|
||||||
int n = atoi(tok->strAt(6)) + atoi(tok->strAt(15));
|
int n = atoi(tok->strAt(6)) + atoi(tok->strAt(15));
|
||||||
if (n > size)
|
if (n > size)
|
||||||
_errorLogger->strncatUsage(_tokenizer, tok->tokAt(9));
|
strncatUsage(tok->tokAt(9));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -288,7 +309,7 @@ void CheckBufferOverrunClass::CheckBufferOverrun_CheckScope(const Token *tok, co
|
||||||
}
|
}
|
||||||
if (len > (int)size)
|
if (len > (int)size)
|
||||||
{
|
{
|
||||||
_errorLogger->bufferOverrun(_tokenizer, tok);
|
bufferOverrun(tok);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -297,13 +318,13 @@ void CheckBufferOverrunClass::CheckBufferOverrun_CheckScope(const Token *tok, co
|
||||||
{
|
{
|
||||||
int n = std::atoi(tok->strAt(4));
|
int n = std::atoi(tok->strAt(4));
|
||||||
if (n > size)
|
if (n > size)
|
||||||
_errorLogger->outOfBounds(_tokenizer, tok->tokAt(4), "snprintf size");
|
outOfBounds(tok->tokAt(4), "snprintf size");
|
||||||
}
|
}
|
||||||
|
|
||||||
// cin..
|
// cin..
|
||||||
if (varid > 0 && Token::Match(tok, "cin >> %varid% ;", varid))
|
if (varid > 0 && Token::Match(tok, "cin >> %varid% ;", varid))
|
||||||
{
|
{
|
||||||
_errorLogger->bufferOverrun(_tokenizer, tok);
|
bufferOverrun(tok);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Function call..
|
// Function call..
|
||||||
|
@ -589,6 +610,3 @@ void CheckBufferOverrunClass::bufferOverrun()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -68,6 +68,10 @@ private:
|
||||||
std::list<const Token *> _callStack;
|
std::list<const Token *> _callStack;
|
||||||
|
|
||||||
void arrayIndexOutOfBounds(const Token *tok);
|
void arrayIndexOutOfBounds(const Token *tok);
|
||||||
|
void arrayIndexOutOfBounds();
|
||||||
|
void bufferOverrun(const Token *tok);
|
||||||
|
void strncatUsage(const Token *tok);
|
||||||
|
void outOfBounds(const Token *tok, const std::string &what);
|
||||||
};
|
};
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
|
@ -454,7 +454,7 @@ Token *CheckMemoryLeakClass::getcode(const Token *tok, std::list<const Token *>
|
||||||
if (alloc != Many && dealloctype != No && dealloctype != Many && dealloctype != alloc)
|
if (alloc != Many && dealloctype != No && dealloctype != Many && dealloctype != alloc)
|
||||||
{
|
{
|
||||||
callstack.push_back(tok);
|
callstack.push_back(tok);
|
||||||
_errorLogger->mismatchAllocDealloc(_tokenizer, callstack, varname);
|
mismatchAllocDealloc(callstack, varname);
|
||||||
callstack.pop_back();
|
callstack.pop_back();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -501,7 +501,7 @@ Token *CheckMemoryLeakClass::getcode(const Token *tok, std::list<const Token *>
|
||||||
if (dealloc != Many && alloctype != No && alloctype != Many && alloctype != dealloc)
|
if (dealloc != Many && alloctype != No && alloctype != Many && alloctype != dealloc)
|
||||||
{
|
{
|
||||||
callstack.push_back(tok);
|
callstack.push_back(tok);
|
||||||
_errorLogger->mismatchAllocDealloc(_tokenizer, callstack, varname);
|
mismatchAllocDealloc(callstack, varname);
|
||||||
callstack.pop_back();
|
callstack.pop_back();
|
||||||
}
|
}
|
||||||
dealloctype = dealloc;
|
dealloctype = dealloc;
|
||||||
|
@ -1499,7 +1499,7 @@ void CheckMemoryLeakClass::CheckMemoryLeak_ClassMembers_Variable(const char clas
|
||||||
if (alloc != Many && Dealloc != No && Dealloc != Many && Dealloc != alloc)
|
if (alloc != Many && Dealloc != No && Dealloc != Many && Dealloc != alloc)
|
||||||
{
|
{
|
||||||
callstack.push_back(tok);
|
callstack.push_back(tok);
|
||||||
_errorLogger->mismatchAllocDealloc(_tokenizer, callstack, (std::string(classname) + "::" + varname).c_str());
|
mismatchAllocDealloc(callstack, (std::string(classname) + "::" + varname).c_str());
|
||||||
callstack.pop_back();
|
callstack.pop_back();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1529,7 +1529,7 @@ void CheckMemoryLeakClass::CheckMemoryLeak_ClassMembers_Variable(const char clas
|
||||||
if (dealloc != Many && Alloc != No && Alloc != Many && Alloc != dealloc)
|
if (dealloc != Many && Alloc != No && Alloc != Many && Alloc != dealloc)
|
||||||
{
|
{
|
||||||
callstack.push_back(tok);
|
callstack.push_back(tok);
|
||||||
_errorLogger->mismatchAllocDealloc(_tokenizer, callstack, (std::string(classname) + "::" + varname).c_str());
|
mismatchAllocDealloc(callstack, (std::string(classname) + "::" + varname).c_str());
|
||||||
callstack.pop_back();
|
callstack.pop_back();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1648,3 +1648,7 @@ void CheckMemoryLeakClass::mismatchSizeError(const Token *tok, const std::string
|
||||||
reportError(tok, "error", "mismatchSize", "The given size " + sz + " is mismatching");
|
reportError(tok, "error", "mismatchSize", "The given size " + sz + " is mismatching");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CheckMemoryLeakClass::mismatchAllocDealloc(const std::list<const Token *> &callstack, const std::string &varname)
|
||||||
|
{
|
||||||
|
reportError(callstack, "error", "mismatchAllocDealloc", "Mismatching allocation and deallocation: " + varname);
|
||||||
|
}
|
||||||
|
|
|
@ -131,7 +131,7 @@ private:
|
||||||
void deallocDeallocError(const Token *tok, const std::string &varname);
|
void deallocDeallocError(const Token *tok, const std::string &varname);
|
||||||
void deallocuseError(const Token *tok, const std::string &varname);
|
void deallocuseError(const Token *tok, const std::string &varname);
|
||||||
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);
|
||||||
|
|
||||||
// Experimental functionality..
|
// Experimental functionality..
|
||||||
protected:
|
protected:
|
||||||
|
|
|
@ -95,46 +95,23 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual void reportStatus(unsigned int index, unsigned int max) = 0;
|
virtual void reportStatus(unsigned int index, unsigned int max) = 0;
|
||||||
|
|
||||||
void genericError(const Tokenizer *tokenizer, const Token *Location, const std::string &msg)
|
|
||||||
{
|
|
||||||
_writemsg(tokenizer, Location, "error", "" + msg + "", "genericError");
|
|
||||||
}
|
|
||||||
static bool genericError()
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void arrayIndexOutOfBounds(const Tokenizer *tokenizer, const std::list<const Token *> &Location)
|
|
||||||
{
|
|
||||||
_writemsg(tokenizer, Location, "all", "Array index out of bounds", "arrayIndexOutOfBounds");
|
|
||||||
}
|
|
||||||
static bool arrayIndexOutOfBounds(const Settings &s)
|
static bool arrayIndexOutOfBounds(const Settings &s)
|
||||||
{
|
{
|
||||||
return s._showAll;
|
return s._showAll;
|
||||||
}
|
}
|
||||||
|
|
||||||
void bufferOverrun(const Tokenizer *tokenizer, const Token *Location)
|
|
||||||
{
|
|
||||||
_writemsg(tokenizer, Location, "all", "Buffer overrun", "bufferOverrun");
|
|
||||||
}
|
|
||||||
static bool bufferOverrun(const Settings &s)
|
static bool bufferOverrun(const Settings &s)
|
||||||
{
|
{
|
||||||
return s._showAll;
|
return s._showAll;
|
||||||
}
|
}
|
||||||
|
|
||||||
void strncatUsage(const Tokenizer *tokenizer, const Token *Location)
|
|
||||||
{
|
|
||||||
_writemsg(tokenizer, Location, "all", "Dangerous usage of strncat, possible buffer overrun", "strncatUsage");
|
|
||||||
}
|
|
||||||
static bool strncatUsage(const Settings &s)
|
static bool strncatUsage(const Settings &s)
|
||||||
{
|
{
|
||||||
return s._showAll;
|
return s._showAll;
|
||||||
}
|
}
|
||||||
|
|
||||||
void outOfBounds(const Tokenizer *tokenizer, const Token *Location, const std::string &what)
|
|
||||||
{
|
|
||||||
_writemsg(tokenizer, Location, "error", "" + what + " is out of bounds", "outOfBounds");
|
|
||||||
}
|
|
||||||
static bool outOfBounds()
|
static bool outOfBounds()
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
|
@ -189,10 +166,7 @@ public:
|
||||||
return s._checkCodingStyle || s._showAll;
|
return s._checkCodingStyle || s._showAll;
|
||||||
}
|
}
|
||||||
|
|
||||||
void mismatchAllocDealloc(const Tokenizer *tokenizer, const std::list<const Token *> &Location, const std::string &varname)
|
|
||||||
{
|
|
||||||
_writemsg(tokenizer, Location, "error", "Mismatching allocation and deallocation: " + varname + "", "mismatchAllocDealloc");
|
|
||||||
}
|
|
||||||
static bool mismatchAllocDealloc()
|
static bool mismatchAllocDealloc()
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
|
|
Loading…
Reference in New Issue