Fixed #2167 (Drop linefeeds from error messages)
This commit is contained in:
parent
0328d26fcb
commit
ba7a3b376e
|
@ -184,10 +184,10 @@ void CppCheckExecutor::reportErr(const ErrorLogger::ErrorMessage &msg)
|
||||||
{
|
{
|
||||||
if (_settings._xml)
|
if (_settings._xml)
|
||||||
{
|
{
|
||||||
reportErr(msg.toXML());
|
reportErr(msg.toXML(_settings._verbose));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
reportErr(msg.toString(_settings._outputFormat));
|
reportErr(msg.toString(_settings._verbose, _settings._outputFormat));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -93,7 +93,7 @@ int ThreadExecutor::handleRead(unsigned int &result)
|
||||||
msg.deserialize(buf);
|
msg.deserialize(buf);
|
||||||
|
|
||||||
// Alert only about unique errors
|
// Alert only about unique errors
|
||||||
std::string errmsg = msg.toString();
|
std::string errmsg = msg.toString(_settings._verbose);
|
||||||
if (std::find(_errorList.begin(), _errorList.end(), errmsg) == _errorList.end())
|
if (std::find(_errorList.begin(), _errorList.end(), errmsg) == _errorList.end())
|
||||||
{
|
{
|
||||||
_errorList.push_back(errmsg);
|
_errorList.push_back(errmsg);
|
||||||
|
|
|
@ -69,7 +69,7 @@ void ThreadResult::reportErr(const ErrorLogger::ErrorMessage &msg)
|
||||||
item.files = files;
|
item.files = files;
|
||||||
item.id = QString(msg._id.c_str());
|
item.id = QString(msg._id.c_str());
|
||||||
item.lines = lines;
|
item.lines = lines;
|
||||||
item.msg = QString(msg._msg.c_str());
|
item.msg = QString::fromStdString(msg.verboseMessage());
|
||||||
item.severity = QString::fromStdString(Severity::toString(msg._severity));
|
item.severity = QString::fromStdString(Severity::toString(msg._severity));
|
||||||
|
|
||||||
if (msg._severity != Severity::debug)
|
if (msg._severity != Severity::debug)
|
||||||
|
|
10
lib/check.h
10
lib/check.h
|
@ -110,7 +110,7 @@ public:
|
||||||
*/
|
*/
|
||||||
static void reportError(const ErrorLogger::ErrorMessage &errmsg)
|
static void reportError(const ErrorLogger::ErrorMessage &errmsg)
|
||||||
{
|
{
|
||||||
std::cout << errmsg.toXML() << std::endl;
|
std::cout << errmsg.toXML(true) << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -130,14 +130,6 @@ protected:
|
||||||
/** report an error */
|
/** report an error */
|
||||||
void reportError(const std::list<const Token *> &callstack, Severity::SeverityType severity, const std::string &id, std::string msg)
|
void reportError(const std::list<const Token *> &callstack, Severity::SeverityType severity, const std::string &id, std::string msg)
|
||||||
{
|
{
|
||||||
// If the verbose flag hasn't been given, don't show verbose information
|
|
||||||
if (!_settings || !_settings->_verbose)
|
|
||||||
{
|
|
||||||
std::string::size_type pos = msg.find("\n");
|
|
||||||
if (pos != std::string::npos)
|
|
||||||
msg.erase(pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
for (std::list<const Token *>::const_iterator it = callstack.begin(); it != callstack.end(); ++it)
|
||||||
{
|
{
|
||||||
|
|
|
@ -398,7 +398,8 @@ void CheckOther::invalidScanfError(const Token *tok)
|
||||||
{
|
{
|
||||||
reportError(tok, Severity::warning,
|
reportError(tok, Severity::warning,
|
||||||
"invalidscanf", "scanf without field width limits can crash with huge input data\n"
|
"invalidscanf", "scanf without field width limits can crash with huge input data\n"
|
||||||
"To fix this error message add a field width specifier:\n"
|
"scanf without field width limits can crash with huge input data. To fix this error "
|
||||||
|
"message add a field width specifier:\n"
|
||||||
" %s => %20s\n"
|
" %s => %20s\n"
|
||||||
" %i => %3i\n"
|
" %i => %3i\n"
|
||||||
"\n"
|
"\n"
|
||||||
|
@ -2429,8 +2430,9 @@ void CheckOther::variableScopeError(const Token *tok, const std::string &varname
|
||||||
Severity::style,
|
Severity::style,
|
||||||
"variableScope",
|
"variableScope",
|
||||||
"The scope of the variable " + varname + " can be reduced\n"
|
"The scope of the variable " + varname + " can be reduced\n"
|
||||||
"Warning: It can be unsafe to fix this message. Be careful. Especially when there are inner loops.\n"
|
"The scope of the variable " + varname + " can be reduced. Warning: It can be unsafe "
|
||||||
"Here is an example where cppcheck will write that the scope for 'i' can be reduced:\n"
|
"to fix this message. Be careful. Especially when there are inner loops. Here is an "
|
||||||
|
"example where cppcheck will write that the scope for 'i' can be reduced:\n"
|
||||||
"void f(int x)\n"
|
"void f(int x)\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" int i = 0;\n"
|
" int i = 0;\n"
|
||||||
|
@ -2442,7 +2444,6 @@ void CheckOther::variableScopeError(const Token *tok, const std::string &varname
|
||||||
" }\n"
|
" }\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
"}\n"
|
"}\n"
|
||||||
"\n"
|
|
||||||
"When you see this message it is always safe to reduce the variable scope 1 level.");
|
"When you see this message it is always safe to reduce the variable scope 1 level.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -308,7 +308,7 @@ Settings CppCheck::settings() const
|
||||||
|
|
||||||
void CppCheck::reportErr(const ErrorLogger::ErrorMessage &msg)
|
void CppCheck::reportErr(const ErrorLogger::ErrorMessage &msg)
|
||||||
{
|
{
|
||||||
std::string errmsg = msg.toString();
|
std::string errmsg = msg.toString(_settings._verbose);
|
||||||
|
|
||||||
// Alert only about unique errors
|
// Alert only about unique errors
|
||||||
if (std::find(_errorList.begin(), _errorList.end(), errmsg) != _errorList.end())
|
if (std::find(_errorList.begin(), _errorList.end(), errmsg) != _errorList.end())
|
||||||
|
|
|
@ -32,16 +32,31 @@ ErrorLogger::ErrorMessage::ErrorMessage(const std::list<FileLocation> &callStack
|
||||||
{
|
{
|
||||||
_callStack = callStack;
|
_callStack = callStack;
|
||||||
_severity = severity;
|
_severity = severity;
|
||||||
_msg = msg;
|
setmsg(msg);
|
||||||
_id = id;
|
_id = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ErrorLogger::ErrorMessage::setmsg(const std::string &msg)
|
||||||
|
{
|
||||||
|
const std::string::size_type pos = msg.find("\n");
|
||||||
|
if (pos == std::string::npos)
|
||||||
|
{
|
||||||
|
_shortMessage = msg;
|
||||||
|
_verboseMessage = msg;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_shortMessage = msg.substr(0, pos - 1);
|
||||||
|
_verboseMessage = msg.substr(pos + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
std::string ErrorLogger::ErrorMessage::serialize() const
|
std::string ErrorLogger::ErrorMessage::serialize() const
|
||||||
{
|
{
|
||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
oss << _id.length() << " " << _id;
|
oss << _id.length() << " " << _id;
|
||||||
oss << Severity::toString(_severity).length() << " " << Severity::toString(_severity);
|
oss << Severity::toString(_severity).length() << " " << Severity::toString(_severity);
|
||||||
oss << _msg.length() << " " << _msg;
|
oss << _shortMessage.length() << " " << _shortMessage;
|
||||||
oss << _callStack.size() << " ";
|
oss << _callStack.size() << " ";
|
||||||
|
|
||||||
for (std::list<ErrorLogger::ErrorMessage::FileLocation>::const_iterator tok = _callStack.begin(); tok != _callStack.end(); ++tok)
|
for (std::list<ErrorLogger::ErrorMessage::FileLocation>::const_iterator tok = _callStack.begin(); tok != _callStack.end(); ++tok)
|
||||||
|
@ -79,7 +94,7 @@ bool ErrorLogger::ErrorMessage::deserialize(const std::string &data)
|
||||||
|
|
||||||
_id = results[0];
|
_id = results[0];
|
||||||
_severity = Severity::fromString(results[1]);
|
_severity = Severity::fromString(results[1]);
|
||||||
_msg = results[2];
|
_shortMessage = results[2];
|
||||||
|
|
||||||
unsigned int stackSize = 0;
|
unsigned int stackSize = 0;
|
||||||
if (!(iss >> stackSize))
|
if (!(iss >> stackSize))
|
||||||
|
@ -146,7 +161,7 @@ static std::string stringToXml(std::string s)
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string ErrorLogger::ErrorMessage::toXML() const
|
std::string ErrorLogger::ErrorMessage::toXML(bool verbose) const
|
||||||
{
|
{
|
||||||
std::ostringstream xml;
|
std::ostringstream xml;
|
||||||
xml << "<error";
|
xml << "<error";
|
||||||
|
@ -157,7 +172,7 @@ std::string ErrorLogger::ErrorMessage::toXML() const
|
||||||
}
|
}
|
||||||
xml << " id=\"" << _id << "\"";
|
xml << " id=\"" << _id << "\"";
|
||||||
xml << " severity=\"" << (_severity == Severity::error ? "error" : "style") << "\"";
|
xml << " severity=\"" << (_severity == Severity::error ? "error" : "style") << "\"";
|
||||||
xml << " msg=\"" << stringToXml(_msg) << "\"";
|
xml << " msg=\"" << stringToXml(verbose ? _verboseMessage : _shortMessage) << "\"";
|
||||||
xml << "/>";
|
xml << "/>";
|
||||||
return xml.str();
|
return xml.str();
|
||||||
}
|
}
|
||||||
|
@ -172,7 +187,7 @@ void ErrorLogger::ErrorMessage::findAndReplace(std::string &source, const std::s
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string ErrorLogger::ErrorMessage::toString(const std::string &outputFormat) const
|
std::string ErrorLogger::ErrorMessage::toString(bool verbose, const std::string &outputFormat) const
|
||||||
{
|
{
|
||||||
if (outputFormat.length() == 0)
|
if (outputFormat.length() == 0)
|
||||||
{
|
{
|
||||||
|
@ -181,7 +196,7 @@ std::string ErrorLogger::ErrorMessage::toString(const std::string &outputFormat)
|
||||||
text << callStackToString(_callStack) << ": ";
|
text << callStackToString(_callStack) << ": ";
|
||||||
if (_severity != Severity::none)
|
if (_severity != Severity::none)
|
||||||
text << "(" << Severity::toString(_severity) << ") ";
|
text << "(" << Severity::toString(_severity) << ") ";
|
||||||
text << _msg;
|
text << (verbose ? _verboseMessage : _shortMessage);
|
||||||
return text.str();
|
return text.str();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -189,7 +204,7 @@ std::string ErrorLogger::ErrorMessage::toString(const std::string &outputFormat)
|
||||||
std::string result = outputFormat;
|
std::string result = outputFormat;
|
||||||
findAndReplace(result, "{id}", _id);
|
findAndReplace(result, "{id}", _id);
|
||||||
findAndReplace(result, "{severity}", Severity::toString(_severity));
|
findAndReplace(result, "{severity}", Severity::toString(_severity));
|
||||||
findAndReplace(result, "{message}", _msg);
|
findAndReplace(result, "{message}", verbose ? _verboseMessage : _shortMessage);
|
||||||
|
|
||||||
if (!_callStack.empty())
|
if (!_callStack.empty())
|
||||||
{
|
{
|
||||||
|
|
|
@ -120,18 +120,50 @@ public:
|
||||||
|
|
||||||
ErrorMessage(const std::list<FileLocation> &callStack, Severity::SeverityType severity, const std::string &msg, const std::string &id);
|
ErrorMessage(const std::list<FileLocation> &callStack, Severity::SeverityType severity, const std::string &msg, const std::string &id);
|
||||||
ErrorMessage();
|
ErrorMessage();
|
||||||
std::string toXML() const;
|
|
||||||
|
/**
|
||||||
|
* Format the error message in XML format
|
||||||
|
* @param verbose use verbose message
|
||||||
|
*/
|
||||||
|
std::string toXML(bool verbose) const;
|
||||||
|
|
||||||
static std::string getXMLHeader();
|
static std::string getXMLHeader();
|
||||||
static std::string getXMLFooter();
|
static std::string getXMLFooter();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Format the error message into a string.
|
* Format the error message into a string.
|
||||||
|
* @param verbose use verbose message
|
||||||
* @param outputFormat Empty string to use default output format
|
* @param outputFormat Empty string to use default output format
|
||||||
* or template to be used. E.g. "{file}:{line},{severity},{id},{message}"
|
* or template to be used. E.g. "{file}:{line},{severity},{id},{message}"
|
||||||
*/
|
*/
|
||||||
std::string toString(const std::string &outputFormat = "") const;
|
std::string toString(bool verbose, const std::string &outputFormat = "") const;
|
||||||
|
|
||||||
|
std::string serialize() const;
|
||||||
|
bool deserialize(const std::string &data);
|
||||||
|
|
||||||
|
std::list<FileLocation> _callStack;
|
||||||
|
Severity::SeverityType _severity;
|
||||||
|
std::string _id;
|
||||||
|
|
||||||
|
/** source file (not header) */
|
||||||
|
std::string file0;
|
||||||
|
|
||||||
|
/** set short and verbose messages */
|
||||||
|
void setmsg(const std::string &msg);
|
||||||
|
|
||||||
|
/** Short message (single line short message) */
|
||||||
|
const std::string &shortMessage() const
|
||||||
|
{
|
||||||
|
return _shortMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Verbose message (may be the same as the short message) */
|
||||||
|
const std::string &verboseMessage() const
|
||||||
|
{
|
||||||
|
return _verboseMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
/**
|
/**
|
||||||
* Replace all occurances of searchFor with replaceWith in the
|
* Replace all occurances of searchFor with replaceWith in the
|
||||||
* given source.
|
* given source.
|
||||||
|
@ -140,15 +172,12 @@ public:
|
||||||
* @param replaceWith What will replace the found item
|
* @param replaceWith What will replace the found item
|
||||||
*/
|
*/
|
||||||
static void findAndReplace(std::string &source, const std::string &searchFor, const std::string &replaceWith);
|
static void findAndReplace(std::string &source, const std::string &searchFor, const std::string &replaceWith);
|
||||||
std::string serialize() const;
|
|
||||||
bool deserialize(const std::string &data);
|
|
||||||
std::list<FileLocation> _callStack;
|
|
||||||
Severity::SeverityType _severity;
|
|
||||||
std::string _msg;
|
|
||||||
std::string _id;
|
|
||||||
|
|
||||||
/** source file (not header) */
|
/** Short message */
|
||||||
std::string file0;
|
std::string _shortMessage;
|
||||||
|
|
||||||
|
/** Verbose message */
|
||||||
|
std::string _verboseMessage;
|
||||||
};
|
};
|
||||||
|
|
||||||
ErrorLogger() { }
|
ErrorLogger() { }
|
||||||
|
|
|
@ -845,7 +845,7 @@ std::list<std::string> Preprocessor::getcfgs(const std::string &filedata, const
|
||||||
loc.line = linenr;
|
loc.line = linenr;
|
||||||
errmsg._callStack.push_back(loc);
|
errmsg._callStack.push_back(loc);
|
||||||
errmsg._severity = Severity::fromString("error");
|
errmsg._severity = Severity::fromString("error");
|
||||||
errmsg._msg = "mismatching number of '(' and ')' in this line: " + def;
|
errmsg.setmsg("mismatching number of '(' and ')' in this line: " + def);
|
||||||
errmsg._id = "preprocessor" + lineStream.str();
|
errmsg._id = "preprocessor" + lineStream.str();
|
||||||
_errorLogger->reportErr(errmsg);
|
_errorLogger->reportErr(errmsg);
|
||||||
ret.clear();
|
ret.clear();
|
||||||
|
@ -993,8 +993,8 @@ std::list<std::string> Preprocessor::getcfgs(const std::string &filedata, const
|
||||||
loc.setfile(filename);
|
loc.setfile(filename);
|
||||||
loc.line = 1;
|
loc.line = 1;
|
||||||
errmsg._callStack.push_back(loc);
|
errmsg._callStack.push_back(loc);
|
||||||
errmsg._severity = Severity::fromString("error");
|
errmsg._severity = Severity::error;
|
||||||
errmsg._msg = "Error parsing this: " + s;
|
errmsg.setmsg("Error parsing this: " + s);
|
||||||
errmsg._id = "preprocessor" + lineStream.str();
|
errmsg._id = "preprocessor" + lineStream.str();
|
||||||
_errorLogger->reportErr(errmsg);
|
_errorLogger->reportErr(errmsg);
|
||||||
}
|
}
|
||||||
|
@ -2402,11 +2402,11 @@ void Preprocessor::getErrorMessages(std::ostream &ostr)
|
||||||
Severity::style,
|
Severity::style,
|
||||||
"Include file: \"\" not found.",
|
"Include file: \"\" not found.",
|
||||||
"missingInclude");
|
"missingInclude");
|
||||||
ostr << errmsg.toXML() << std::endl;
|
ostr << errmsg.toXML(false) << std::endl;
|
||||||
|
|
||||||
const ErrorLogger::ErrorMessage errmsg2(locationList,
|
const ErrorLogger::ErrorMessage errmsg2(locationList,
|
||||||
Severity::error,
|
Severity::error,
|
||||||
"#error ...",
|
"#error ...",
|
||||||
"preprocessorErrorDirective");
|
"preprocessorErrorDirective");
|
||||||
ostr << errmsg2.toXML() << std::endl;
|
ostr << errmsg2.toXML(false) << std::endl;
|
||||||
}
|
}
|
||||||
|
|
|
@ -388,8 +388,8 @@ private:
|
||||||
{
|
{
|
||||||
// Test the errorlogger..
|
// Test the errorlogger..
|
||||||
ErrorLogger::ErrorMessage errorMessage;
|
ErrorLogger::ErrorMessage errorMessage;
|
||||||
errorMessage._msg = "ab<cd>ef";
|
errorMessage.setmsg("ab<cd>ef");
|
||||||
ASSERT_EQUALS("<error id=\"\" severity=\"style\" msg=\"ab<cd>ef\"/>", errorMessage.toXML());
|
ASSERT_EQUALS("<error id=\"\" severity=\"style\" msg=\"ab<cd>ef\"/>", errorMessage.toXML(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -400,8 +400,8 @@ private:
|
||||||
loc.setfile("ab/cd/../ef.h");
|
loc.setfile("ab/cd/../ef.h");
|
||||||
errorMessage._callStack.push_back(loc);
|
errorMessage._callStack.push_back(loc);
|
||||||
const std::string fname(Path::toNativeSeparators("ab/ef.h"));
|
const std::string fname(Path::toNativeSeparators("ab/ef.h"));
|
||||||
ASSERT_EQUALS("<error file=\"" + fname + "\" line=\"0\" id=\"\" severity=\"style\" msg=\"\"/>", errorMessage.toXML());
|
ASSERT_EQUALS("<error file=\"" + fname + "\" line=\"0\" id=\"\" severity=\"style\" msg=\"\"/>", errorMessage.toXML(false));
|
||||||
ASSERT_EQUALS("[" + fname + ":0]: ", errorMessage.toString());
|
ASSERT_EQUALS("[" + fname + ":0]: ", errorMessage.toString(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
void templateFormat()
|
void templateFormat()
|
||||||
|
@ -413,11 +413,11 @@ private:
|
||||||
errorMessage._callStack.push_back(loc);
|
errorMessage._callStack.push_back(loc);
|
||||||
errorMessage._id = "testId";
|
errorMessage._id = "testId";
|
||||||
errorMessage._severity = Severity::fromString("error");
|
errorMessage._severity = Severity::fromString("error");
|
||||||
errorMessage._msg = "long testMessage";
|
errorMessage.setmsg("long testMessage");
|
||||||
const std::string fname(Path::toNativeSeparators("some/{file}file.cpp"));
|
const std::string fname(Path::toNativeSeparators("some/{file}file.cpp"));
|
||||||
ASSERT_EQUALS("<error file=\"" + fname + "\" line=\"10\" id=\"testId\" severity=\"error\" msg=\"long testMessage\"/>", errorMessage.toXML());
|
ASSERT_EQUALS("<error file=\"" + fname + "\" line=\"10\" id=\"testId\" severity=\"error\" msg=\"long testMessage\"/>", errorMessage.toXML(false));
|
||||||
ASSERT_EQUALS("[" + fname + ":10]: (error) long testMessage", errorMessage.toString());
|
ASSERT_EQUALS("[" + fname + ":10]: (error) long testMessage", errorMessage.toString(false));
|
||||||
ASSERT_EQUALS("testId-" + fname + ",error.10?{long testMessage}", errorMessage.toString("{id}-{file},{severity}.{line}?{{message}}"));
|
ASSERT_EQUALS("testId-" + fname + ",error.10?{long testMessage}", errorMessage.toString(false, "{id}-{file},{severity}.{line}?{{message}}"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void getErrorMessages()
|
void getErrorMessages()
|
||||||
|
|
|
@ -271,7 +271,7 @@ void TestFixture::reportOut(const std::string & outmsg)
|
||||||
|
|
||||||
void TestFixture::reportErr(const ErrorLogger::ErrorMessage &msg)
|
void TestFixture::reportErr(const ErrorLogger::ErrorMessage &msg)
|
||||||
{
|
{
|
||||||
const std::string errormessage(msg.toString());
|
const std::string errormessage(msg.toString(false));
|
||||||
if (errout.str().find(errormessage) == std::string::npos)
|
if (errout.str().find(errormessage) == std::string::npos)
|
||||||
errout << errormessage << std::endl;
|
errout << errormessage << std::endl;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue