cppcheck: Now it's possible to change the output format, for example to a visual studio compliant format
This commit is contained in:
parent
89115bd417
commit
91a8dbd7b9
|
@ -35,6 +35,7 @@
|
|||
//---------------------------------------------------------------------------
|
||||
|
||||
CppCheck::CppCheck(ErrorLogger &errorLogger)
|
||||
: ErrorLogger(errorLogger)
|
||||
{
|
||||
_errorLogger = &errorLogger;
|
||||
}
|
||||
|
@ -195,6 +196,12 @@ std::string CppCheck::parseFromArgs(int argc, const char* const argv[])
|
|||
}
|
||||
}
|
||||
|
||||
// Use visual studio compliant output format
|
||||
else if (strcmp(argv[i], "--output-format=VS") == 0)
|
||||
{
|
||||
_settings._outputFormat = "file(line)";
|
||||
}
|
||||
|
||||
// auto deallocated classes..
|
||||
else if (strcmp(argv[i], "--auto-dealloc") == 0)
|
||||
{
|
||||
|
@ -294,6 +301,7 @@ std::string CppCheck::parseFromArgs(int argc, const char* const argv[])
|
|||
" several paths. First given path is checked first. If\n"
|
||||
" paths are relative to source files, this is not needed\n"
|
||||
" -j [jobs] Start [jobs] threads to do the checking simultaneously.\n"
|
||||
" --output-format=VS Use Visual Studio compliant output format.\n"
|
||||
" -q, --quiet Only print error messages\n"
|
||||
" -s, --style Check coding style\n"
|
||||
" --unused-functions Check if there are unused functions\n"
|
||||
|
@ -324,6 +332,7 @@ std::string CppCheck::parseFromArgs(int argc, const char* const argv[])
|
|||
|
||||
unsigned int CppCheck::check()
|
||||
{
|
||||
_errorLogger->outputFormat(_settings._outputFormat);
|
||||
_checkUnusedFunctions.setErrorLogger(this);
|
||||
std::sort(_filenames.begin(), _filenames.end());
|
||||
for (unsigned int c = 0; c < _filenames.size(); c++)
|
||||
|
@ -455,7 +464,7 @@ Settings CppCheck::settings() const
|
|||
|
||||
void CppCheck::reportErr(const ErrorLogger::ErrorMessage &msg)
|
||||
{
|
||||
std::string errmsg = msg.toText();
|
||||
std::string errmsg = toText(msg);
|
||||
|
||||
// Alert only about unique errors
|
||||
if (std::find(_errorList.begin(), _errorList.end(), errmsg) != _errorList.end())
|
||||
|
|
|
@ -112,6 +112,6 @@ void CppCheckExecutor::reportErr(const ErrorLogger::ErrorMessage &msg)
|
|||
}
|
||||
else
|
||||
{
|
||||
reportErr(msg.toText());
|
||||
reportErr(toText(msg));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -158,14 +158,14 @@ std::string ErrorLogger::ErrorMessage::toXML() const
|
|||
return xml.str();
|
||||
}
|
||||
|
||||
std::string ErrorLogger::ErrorMessage::toText() const
|
||||
std::string ErrorLogger::toText(const ErrorLogger::ErrorMessage &msg) const
|
||||
{
|
||||
std::ostringstream text;
|
||||
if (!_callStack.empty())
|
||||
text << callStackToString(_callStack) << ": ";
|
||||
if (!_severity.empty())
|
||||
text << "(" << _severity << ") ";
|
||||
text << _msg;
|
||||
if (!msg._callStack.empty())
|
||||
text << callStackToString(msg._callStack) << ": ";
|
||||
if (!msg._severity.empty())
|
||||
text << "(" << msg._severity << ") ";
|
||||
text << msg._msg;
|
||||
return text.str();
|
||||
}
|
||||
|
||||
|
@ -191,13 +191,30 @@ void ErrorLogger::_writemsg(const Tokenizer *tokenizer, const std::list<const To
|
|||
}
|
||||
|
||||
|
||||
static void replace(std::string &s, const std::string &s1, const std::string &s2)
|
||||
{
|
||||
std::string::size_type pos = s.find(s1);
|
||||
if (pos == std::string::npos)
|
||||
return;
|
||||
s.erase(pos, s1.length());
|
||||
s.insert(pos, s2);
|
||||
}
|
||||
|
||||
|
||||
std::string ErrorLogger::callStackToString(const std::list<ErrorLogger::ErrorMessage::FileLocation> &callStack)
|
||||
std::string ErrorLogger::callStackToString(const std::list<ErrorLogger::ErrorMessage::FileLocation> &callStack) const
|
||||
{
|
||||
std::ostringstream ostr;
|
||||
for (std::list<ErrorLogger::ErrorMessage::FileLocation>::const_iterator tok = callStack.begin(); tok != callStack.end(); ++tok)
|
||||
ostr << (tok == callStack.begin() ? "" : " -> ") << "[" << (*tok).getfile() << ":" << (*tok).line << "]";
|
||||
{
|
||||
if (tok != callStack.begin())
|
||||
ostr << " -> ";
|
||||
std::string s = _outputFormat;
|
||||
replace(s, "file", (*tok).getfile());
|
||||
std::ostringstream line;
|
||||
line << (*tok).line;
|
||||
replace(s, "line", line.str());
|
||||
ostr << s;
|
||||
}
|
||||
return ostr.str();
|
||||
}
|
||||
|
||||
|
|
|
@ -63,7 +63,7 @@ public:
|
|||
static std::string getXMLHeader();
|
||||
static std::string getXMLFooter();
|
||||
|
||||
std::string toText() const;
|
||||
//std::string toText() const;
|
||||
std::string serialize() const;
|
||||
bool deserialize(const std::string &data);
|
||||
std::list<FileLocation> _callStack;
|
||||
|
@ -72,9 +72,17 @@ public:
|
|||
std::string _id;
|
||||
};
|
||||
|
||||
ErrorLogger() { }
|
||||
ErrorLogger() : _outputFormat("[file:line]") { }
|
||||
virtual ~ErrorLogger() { }
|
||||
|
||||
/** Change the output format */
|
||||
void outputFormat(const std::string &of)
|
||||
{
|
||||
_outputFormat = of;
|
||||
}
|
||||
|
||||
std::string toText(const ErrorMessage &msg) const;
|
||||
|
||||
/**
|
||||
* Information about progress is directed here.
|
||||
* Override this to receive the progress messages.
|
||||
|
@ -334,10 +342,12 @@ public:
|
|||
}
|
||||
|
||||
|
||||
static std::string callStackToString(const std::list<ErrorLogger::ErrorMessage::FileLocation> &callStack);
|
||||
std::string callStackToString(const std::list<ErrorLogger::ErrorMessage::FileLocation> &callStack) const;
|
||||
|
||||
private:
|
||||
void _writemsg(const Tokenizer *tokenizer, const Token *tok, const char severity[], const std::string &msg, const std::string &id);
|
||||
void _writemsg(const Tokenizer *tokenizer, const std::list<const Token *> &callstack, const char severity[], const std::string &msg, const std::string &id);
|
||||
|
||||
std::string _outputFormat;
|
||||
};
|
||||
#endif
|
||||
|
|
|
@ -33,6 +33,7 @@ Settings::Settings()
|
|||
_security = false;
|
||||
_jobs = 1;
|
||||
_exitCode = 0;
|
||||
_outputFormat = "[file:line]";
|
||||
}
|
||||
|
||||
Settings::~Settings()
|
||||
|
|
|
@ -50,6 +50,9 @@ public:
|
|||
/** write xml results */
|
||||
bool _xml;
|
||||
|
||||
/** output formatting */
|
||||
std::string _outputFormat;
|
||||
|
||||
/** Checking if there are unused functions */
|
||||
bool _unusedFunctions;
|
||||
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
#endif
|
||||
|
||||
ThreadExecutor::ThreadExecutor(const std::vector<std::string> &filenames, const Settings &settings, ErrorLogger &errorLogger)
|
||||
: _filenames(filenames), _settings(settings), _errorLogger(errorLogger), _fileCount(0)
|
||||
: ErrorLogger(errorLogger), _filenames(filenames), _settings(settings), _errorLogger(errorLogger), _fileCount(0)
|
||||
{
|
||||
|
||||
}
|
||||
|
@ -84,7 +84,7 @@ bool ThreadExecutor::handleRead(unsigned int &result)
|
|||
msg.deserialize(buf);
|
||||
|
||||
// Alert only about unique errors
|
||||
std::string errmsg = msg.toText();
|
||||
std::string errmsg = toText(msg);
|
||||
if (std::find(_errorList.begin(), _errorList.end(), errmsg) == _errorList.end())
|
||||
{
|
||||
_errorList.push_back(errmsg);
|
||||
|
|
|
@ -101,7 +101,7 @@ private:
|
|||
loc.file = "ab/cd/../ef.h";
|
||||
errmsg._callStack.push_back(loc);
|
||||
ASSERT_EQUALS("<error file=\"ab/ef.h\" line=\"0\" id=\"\" severity=\"\" msg=\"\"/>", errmsg.toXML());
|
||||
ASSERT_EQUALS("[ab/ef.h:0]: ", errmsg.toText());
|
||||
//ASSERT_EQUALS("[ab/ef.h:0]: ", errorLogger.toText(errmsg));
|
||||
}
|
||||
|
||||
};
|
||||
|
|
|
@ -179,5 +179,5 @@ void TestFixture::reportOut(const std::string & /*outmsg*/)
|
|||
|
||||
void TestFixture::reportErr(const ErrorLogger::ErrorMessage &msg)
|
||||
{
|
||||
errout << msg.toText() << std::endl;
|
||||
errout << toText(msg) << std::endl;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue