Listing error messages in XML format

This commit is contained in:
Daniel Marjamäki 2009-08-04 21:36:55 +02:00
parent 9e348ca739
commit cb57bd6678
11 changed files with 50 additions and 37 deletions

View File

@ -87,20 +87,14 @@ protected:
void reportError(const Token *tok, const Severity::e severity, const std::string &id, const std::string &msg)
{
std::list<const Token *> callstack;
callstack.push_back(tok);
if (tok)
callstack.push_back(tok);
reportError(callstack, severity, id, msg);
}
/** report an error */
void reportError(const std::list<const Token *> &callstack, const Severity::e severity, const std::string &id, std::string msg)
{
// No errorLogger => just report the message to stdout
if (_errorLogger == NULL)
{
std::cout << "(" << Severity::stringify(severity) << ") " << msg << std::endl;
return;
}
// If the verbose flag hasn't been given, don't show verbose information
if (!_settings || !_settings->_verbose)
{
@ -118,7 +112,12 @@ protected:
locationList.push_back(loc);
}
_errorLogger->reportErr(ErrorLogger::ErrorMessage(locationList, Severity::stringify(severity), msg, id));
const ErrorLogger::ErrorMessage errmsg(locationList, Severity::stringify(severity), msg, id);
if (_errorLogger)
_errorLogger->reportErr(errmsg);
else
std::cout << errmsg.toXML() << std::endl;
}
private:

View File

@ -70,7 +70,6 @@ private:
void getErrorMessages()
{
std::cout << "===auto variables===" << "\n";
reportError(0, Severity::error, "autoVariables", "Wrong assignement of an auto-variable to an effective parameter of a function");
errorReturnPointerToLocalArray(0);
}

View File

@ -46,9 +46,14 @@ CheckBufferOverrun instance;
void CheckBufferOverrun::arrayIndexOutOfBounds(const Token *tok)
{
_callStack.push_back(tok);
arrayIndexOutOfBounds();
_callStack.pop_back();
if (!tok)
arrayIndexOutOfBounds();
else
{
_callStack.push_back(tok);
arrayIndexOutOfBounds();
_callStack.pop_back();
}
}
void CheckBufferOverrun::arrayIndexOutOfBounds()

View File

@ -79,7 +79,6 @@ private:
void getErrorMessages()
{
std::cout << "===buffer overruns===" << "\n";
arrayIndexOutOfBounds(0);
bufferOverrun(0);
strncatUsage(0);

View File

@ -114,7 +114,6 @@ private:
void getErrorMessages()
{
std::cout << "===classes===" << "\n";
noConstructorError(0, "classname");
uninitVarError(0, "classname", "varname");
operatorEqVarError(0, "classname", "");

View File

@ -59,7 +59,6 @@ private:
void getErrorMessages()
{
std::cout << "===dangerous functions===" << "\n";
dangerousFunctionmktemp(0);
dangerousFunctiongets(0);
dangerousFunctionscanf(0);

View File

@ -224,19 +224,17 @@ 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
void CheckMemoryLeak::reportErr(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<const Token *> callstack;
std::list<ErrorLogger::ErrorMessage::FileLocation> callstack;
callstack.push_back(loc);
if (tok)
callstack.push_back(tok);
return ErrorLogger::ErrorMessage(callstack, Severity::stringify(severity), msg, id);
reportErr(callstack, severity, id, msg);
}
ErrorLogger::ErrorMessage CheckMemoryLeak::errmsg(const std::list<const Token *> &callstack, Severity::e severity, const std::string &id, const std::string &msg) const
void CheckMemoryLeak::reportErr(const std::list<const Token *> &callstack, Severity::e severity, const std::string &id, const std::string &msg) const
{
std::list<ErrorLogger::ErrorMessage::FileLocation> locations;
@ -249,42 +247,47 @@ ErrorLogger::ErrorMessage CheckMemoryLeak::errmsg(const std::list<const Token *>
locations.push_back(loc);
}
return ErrorLogger::ErrorMessage(locations, Severity::stringify(severity), msg, id);
const ErrorLogger::ErrorMessage errmsg(locations, Severity::stringify(severity), msg, id);
if (errorLogger)
errorLogger->reportErr(errmsg);
else
std::cout << errmsg.toXML() << std::endl;
}
void CheckMemoryLeak::memleakError(const Token *tok, const std::string &varname)
{
errorLogger->reportErr(errmsg(tok, Severity::error, "memleak", "Memory leak: " + varname));
reportErr(tok, Severity::error, "memleak", "Memory leak: " + varname);
}
void CheckMemoryLeak::memleakallError(const Token *tok, const std::string &varname)
{
errorLogger->reportErr(errmsg(tok, Severity::possibleError, "memleakall", "Memory leak: " + varname));
reportErr(tok, Severity::possibleError, "memleakall", "Memory leak: " + varname);
}
void CheckMemoryLeak::resourceLeakError(const Token *tok, const std::string &varname)
{
errorLogger->reportErr(errmsg(tok, Severity::error, "resourceLeak", "Resource leak: " + varname));
reportErr(tok, Severity::error, "resourceLeak", "Resource leak: " + varname);
}
void CheckMemoryLeak::deallocDeallocError(const Token *tok, const std::string &varname)
{
errorLogger->reportErr(errmsg(tok, Severity::error, "deallocDealloc", "Deallocating a deallocated pointer: " + varname));
reportErr(tok, Severity::error, "deallocDealloc", "Deallocating a deallocated pointer: " + varname);
}
void CheckMemoryLeak::deallocuseError(const Token *tok, const std::string &varname)
{
errorLogger->reportErr(errmsg(tok, Severity::error, "deallocuse", "Dereferencing '" + varname + "' after it is deallocated / released"));
reportErr(tok, Severity::error, "deallocuse", "Dereferencing '" + varname + "' after it is deallocated / released");
}
void CheckMemoryLeak::mismatchSizeError(const Token *tok, const std::string &sz)
{
errorLogger->reportErr(errmsg(tok, Severity::error, "mismatchSize", "The given size " + sz + " is mismatching"));
reportErr(tok, Severity::error, "mismatchSize", "The given size " + sz + " is mismatching");
}
void CheckMemoryLeak::mismatchAllocDealloc(const std::list<const Token *> &callstack, const std::string &varname)
{
errorLogger->reportErr(errmsg(callstack, Severity::error, "mismatchAllocDealloc", "Mismatching allocation and deallocation: " + varname));
reportErr(callstack, Severity::error, "mismatchAllocDealloc", "Mismatching allocation and deallocation: " + varname);
}
CheckMemoryLeak::AllocType CheckMemoryLeak::functionReturnType(const Token *tok) const

View File

@ -63,7 +63,7 @@ private:
* @param id type of message
* @param msg text
*/
ErrorLogger::ErrorMessage errmsg(const Token *location, Severity::e severity, const std::string &id, const std::string &msg) const;
void reportErr(const Token *location, Severity::e severity, const std::string &id, const std::string &msg) const;
/**
* Report error. Similar with the function Check::reportError
@ -72,7 +72,7 @@ private:
* @param id type of message
* @param msg text
*/
ErrorLogger::ErrorMessage errmsg(const std::list<const Token *> &callstack, Severity::e severity, const std::string &id, const std::string &msg) const;
void reportErr(const std::list<const Token *> &callstack, Severity::e severity, const std::string &id, const std::string &msg) const;
public:
CheckMemoryLeak(const Tokenizer *t, ErrorLogger *e)
@ -233,7 +233,17 @@ private:
void checkScope(const Token *Tok1, const char varname[], bool classmember, unsigned int sz);
void getErrorMessages()
{ }
{
memleakError(0, "varname");
memleakallError(0, "varname");
resourceLeakError(0, "varname");
deallocDeallocError(0, "varname");
deallocuseError(0, "varname");
mismatchSizeError(0, "sz");
std::list<const Token *> callstack;
mismatchAllocDealloc(callstack, "varname");
}
std::string name() const
{

View File

@ -148,7 +148,6 @@ public:
void getErrorMessages()
{
std::cout << "===other===" << "\n";
cstyleCastError(0);
redundantIfDelete0Error(0);
redundantIfRemoveError(0);

View File

@ -103,7 +103,6 @@ private:
void getErrorMessages()
{
std::cout << "===stl===" << "\n";
iteratorsError(0, "container1", "container2");
dereferenceErasedError(0, "iter");
stlOutOfBoundsError(0, "i", "foo");

View File

@ -223,10 +223,12 @@ std::string CppCheck::parseFromArgs(int argc, const char* const argv[])
else if (strcmp(argv[i], "--errorlist") == 0)
{
// call all "getErrorMessages" in all registered Check classes
std::cout << ErrorLogger::ErrorMessage::getXMLHeader();
for (std::list<Check *>::iterator it = Check::instances().begin(); it != Check::instances().end(); ++it)
{
(*it)->getErrorMessages();
}
std::cout << ErrorLogger::ErrorMessage::getXMLFooter() << std::endl;
return "";
}