twistedwave: Fixed #1055 (Support for inline suppressions)
This commit is contained in:
parent
46b19e0184
commit
bbc63b6b5b
|
@ -1136,7 +1136,9 @@ public:
|
||||||
virtual ExecutionPath *copy() = 0;
|
virtual ExecutionPath *copy() = 0;
|
||||||
|
|
||||||
bool bailOut() const
|
bool bailOut() const
|
||||||
{ return bailout_; }
|
{
|
||||||
|
return bailout_;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* bail out all execution paths
|
* bail out all execution paths
|
||||||
|
|
|
@ -122,6 +122,10 @@ void CppCheck::parseFromArgs(int argc, const char* const argv[])
|
||||||
_settings.suppressions(f);
|
_settings.suppressions(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Enables inline suppressions.
|
||||||
|
else if (strcmp(argv[i], "--inline-suppr") == 0)
|
||||||
|
_settings._inlineSuppressions = true;
|
||||||
|
|
||||||
// Verbose error messages (configuration info)
|
// Verbose error messages (configuration info)
|
||||||
else if (strcmp(argv[i], "-v") == 0 || strcmp(argv[i], "--verbose") == 0)
|
else if (strcmp(argv[i], "-v") == 0 || strcmp(argv[i], "--verbose") == 0)
|
||||||
_settings._verbose = true;
|
_settings._verbose = true;
|
||||||
|
@ -331,8 +335,9 @@ void CppCheck::parseFromArgs(int argc, const char* const argv[])
|
||||||
"Syntax:\n"
|
"Syntax:\n"
|
||||||
" cppcheck [--all] [--append=file] [--auto-dealloc file.lst] [--enable]\n"
|
" cppcheck [--all] [--append=file] [--auto-dealloc file.lst] [--enable]\n"
|
||||||
" [--error-exitcode=[n]] [--force] [--help] [-Idir] [-j [jobs]]\n"
|
" [--error-exitcode=[n]] [--force] [--help] [-Idir] [-j [jobs]]\n"
|
||||||
" [--quiet] [--style] [--suppressions file.txt] [--verbose]\n"
|
" [--quiet] [--style] [--suppressions file.txt] [--inline-suppr]\n"
|
||||||
" [--version] [--xml] [file or path1] [file or path] ...\n"
|
" [--verbose] [--version] [--xml] [file or path1]\n"
|
||||||
|
" [file or path] ...\n"
|
||||||
"\n"
|
"\n"
|
||||||
"If path is given instead of filename, *.cpp, *.cxx, *.cc, *.c++ and *.c files\n"
|
"If path is given instead of filename, *.cpp, *.cxx, *.cc, *.c++ and *.c files\n"
|
||||||
"are checked recursively from given directory.\n\n"
|
"are checked recursively from given directory.\n\n"
|
||||||
|
@ -373,6 +378,9 @@ void CppCheck::parseFromArgs(int argc, const char* const argv[])
|
||||||
" --suppressions file Suppress warnings listed in the file. Filename and line\n"
|
" --suppressions file Suppress warnings listed in the file. Filename and line\n"
|
||||||
" are optional. The format of the single line in file is:\n"
|
" are optional. The format of the single line in file is:\n"
|
||||||
" [error id]:[filename]:[line]\n"
|
" [error id]:[filename]:[line]\n"
|
||||||
|
" --inline-suppr Enable inline suppressions. Use them by placing one or\n"
|
||||||
|
" more comments in the form: // cppcheck-suppress memleak\n"
|
||||||
|
" on the lines before the warning to suppress.\n"
|
||||||
" --template '[text]' Format the error messages. E.g.\n"
|
" --template '[text]' Format the error messages. E.g.\n"
|
||||||
" '{file}:{line},{severity},{id},{message}' or\n"
|
" '{file}:{line},{severity},{id},{message}' or\n"
|
||||||
" '{file}({line}):({severity}) {message}'\n"
|
" '{file}({line}):({severity}) {message}'\n"
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <stack>
|
#include <stack>
|
||||||
|
|
||||||
Preprocessor::Preprocessor(const Settings *settings, ErrorLogger *errorLogger) : _settings(settings), _errorLogger(errorLogger)
|
Preprocessor::Preprocessor(Settings *settings, ErrorLogger *errorLogger) : _settings(settings), _errorLogger(errorLogger)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -70,7 +70,7 @@ static char readChar(std::istream &istr)
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Just read the code into a string. Perform simple cleanup of the code */
|
/** Just read the code into a string. Perform simple cleanup of the code */
|
||||||
std::string Preprocessor::read(std::istream &istr)
|
std::string Preprocessor::read(std::istream &istr, const std::string &filename, Settings *settings)
|
||||||
{
|
{
|
||||||
// Get filedata from stream..
|
// Get filedata from stream..
|
||||||
bool ignoreSpace = true;
|
bool ignoreSpace = true;
|
||||||
|
@ -152,7 +152,7 @@ std::string Preprocessor::read(std::istream &istr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return removeParantheses(removeComments(code.str()));
|
return removeParantheses(removeComments(code.str(), filename, settings));
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool hasbom(const std::string &str)
|
static bool hasbom(const std::string &str)
|
||||||
|
@ -164,7 +164,7 @@ static bool hasbom(const std::string &str)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
std::string Preprocessor::removeComments(const std::string &str)
|
std::string Preprocessor::removeComments(const std::string &str, const std::string &filename, Settings *settings)
|
||||||
{
|
{
|
||||||
// For the error report
|
// For the error report
|
||||||
int lineno = 1;
|
int lineno = 1;
|
||||||
|
@ -175,19 +175,46 @@ std::string Preprocessor::removeComments(const std::string &str)
|
||||||
unsigned int newlines = 0;
|
unsigned int newlines = 0;
|
||||||
std::ostringstream code;
|
std::ostringstream code;
|
||||||
char previous = 0;
|
char previous = 0;
|
||||||
|
std::vector<std::string> suppressionIDs;
|
||||||
|
|
||||||
for (std::string::size_type i = hasbom(str) ? 3 : 0; i < str.length(); ++i)
|
for (std::string::size_type i = hasbom(str) ? 3 : 0; i < str.length(); ++i)
|
||||||
{
|
{
|
||||||
char ch = str[i];
|
char ch = str[i];
|
||||||
if (ch < 0)
|
if (ch < 0)
|
||||||
throw std::runtime_error("The code contains characters that are unhandled");
|
throw std::runtime_error("The code contains characters that are unhandled");
|
||||||
|
|
||||||
|
// We have finished a line that didn't contain any comment
|
||||||
|
// (the '\n' is swallowed when a // comment is detected)
|
||||||
|
if (ch == '\n' && !suppressionIDs.empty())
|
||||||
|
{
|
||||||
|
// Add the suppressions.
|
||||||
|
for (size_t j(0); j < suppressionIDs.size(); ++j)
|
||||||
|
settings->addSuppression(suppressionIDs[j], filename, lineno);
|
||||||
|
suppressionIDs.clear();
|
||||||
|
}
|
||||||
|
|
||||||
// Remove comments..
|
// Remove comments..
|
||||||
if (str.compare(i, 2, "//", 0, 2) == 0)
|
if (str.compare(i, 2, "//", 0, 2) == 0)
|
||||||
{
|
{
|
||||||
|
size_t commentStart = i + 2;
|
||||||
i = str.find('\n', i);
|
i = str.find('\n', i);
|
||||||
if (i == std::string::npos)
|
if (i == std::string::npos)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
if (settings->_inlineSuppressions)
|
||||||
|
{
|
||||||
|
std::string comment(str, commentStart, i - commentStart);
|
||||||
|
std::istringstream iss(comment);
|
||||||
|
std::string word;
|
||||||
|
iss >> word;
|
||||||
|
if (word == "cppcheck-suppress")
|
||||||
|
{
|
||||||
|
iss >> word;
|
||||||
|
if (iss)
|
||||||
|
suppressionIDs.push_back(word);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
code << "\n";
|
code << "\n";
|
||||||
previous = '\n';
|
previous = '\n';
|
||||||
++lineno;
|
++lineno;
|
||||||
|
@ -256,11 +283,15 @@ std::string Preprocessor::removeComments(const std::string &str)
|
||||||
|
|
||||||
|
|
||||||
// if there has been <backspace><newline> sequences, add extra newlines..
|
// if there has been <backspace><newline> sequences, add extra newlines..
|
||||||
if (ch == '\n' && newlines > 0)
|
if (ch == '\n')
|
||||||
{
|
{
|
||||||
code << std::string(newlines, '\n');
|
++lineno;
|
||||||
newlines = 0;
|
if (newlines > 0)
|
||||||
previous = '\n';
|
{
|
||||||
|
code << std::string(newlines, '\n');
|
||||||
|
newlines = 0;
|
||||||
|
previous = '\n';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -490,7 +521,7 @@ std::string Preprocessor::replaceIfDefined(const std::string &str)
|
||||||
|
|
||||||
void Preprocessor::preprocess(std::istream &istr, std::string &processedFile, std::list<std::string> &resultConfigurations, const std::string &filename, const std::list<std::string> &includePaths)
|
void Preprocessor::preprocess(std::istream &istr, std::string &processedFile, std::list<std::string> &resultConfigurations, const std::string &filename, const std::list<std::string> &includePaths)
|
||||||
{
|
{
|
||||||
processedFile = read(istr);
|
processedFile = read(istr, filename, _settings);
|
||||||
|
|
||||||
// Replace all tabs with spaces..
|
// Replace all tabs with spaces..
|
||||||
std::replace(processedFile.begin(), processedFile.end(), '\t', ' ');
|
std::replace(processedFile.begin(), processedFile.end(), '\t', ' ');
|
||||||
|
@ -1201,7 +1232,7 @@ void Preprocessor::handleIncludes(std::string &code, const std::string &filename
|
||||||
if (fin.is_open())
|
if (fin.is_open())
|
||||||
{
|
{
|
||||||
filename = *iter + filename;
|
filename = *iter + filename;
|
||||||
processedFile = Preprocessor::read(fin);
|
processedFile = Preprocessor::read(fin, filename, _settings);
|
||||||
fileOpened = true;
|
fileOpened = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1213,7 +1244,7 @@ void Preprocessor::handleIncludes(std::string &code, const std::string &filename
|
||||||
std::ifstream fin(filename.c_str());
|
std::ifstream fin(filename.c_str());
|
||||||
if (fin.is_open())
|
if (fin.is_open())
|
||||||
{
|
{
|
||||||
processedFile = Preprocessor::read(fin);
|
processedFile = Preprocessor::read(fin, filename, _settings);
|
||||||
fileOpened = true;
|
fileOpened = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1577,7 +1608,7 @@ static bool getlines(std::istream &istr, std::string &line)
|
||||||
c = (char)istr.get();
|
c = (char)istr.get();
|
||||||
if (!istr.good())
|
if (!istr.good())
|
||||||
return true;
|
return true;
|
||||||
if (c == '\n' && line.compare(0,1,"#")==0)
|
if (c == '\n' && line.compare(0, 1, "#") == 0)
|
||||||
return true;
|
return true;
|
||||||
line += c;
|
line += c;
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,7 +35,7 @@
|
||||||
class Preprocessor
|
class Preprocessor
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Preprocessor(const Settings *settings = 0, ErrorLogger *errorLogger = 0);
|
Preprocessor(Settings *settings = 0, ErrorLogger *errorLogger = 0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extract the code for each configuration
|
* Extract the code for each configuration
|
||||||
|
@ -70,7 +70,7 @@ public:
|
||||||
void preprocess(std::istream &istr, std::string &processedFile, std::list<std::string> &resultConfigurations, const std::string &filename, const std::list<std::string> &includePaths);
|
void preprocess(std::istream &istr, std::string &processedFile, std::list<std::string> &resultConfigurations, const std::string &filename, const std::list<std::string> &includePaths);
|
||||||
|
|
||||||
/** Just read the code into a string. Perform simple cleanup of the code */
|
/** Just read the code into a string. Perform simple cleanup of the code */
|
||||||
static std::string read(std::istream &istr);
|
static std::string read(std::istream &istr, const std::string &filename, Settings *settings);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get preprocessed code for a given configuration
|
* Get preprocessed code for a given configuration
|
||||||
|
@ -104,7 +104,7 @@ protected:
|
||||||
* @return code without comments
|
* @return code without comments
|
||||||
* @throws std::runtime_error when code contains unhandled characters
|
* @throws std::runtime_error when code contains unhandled characters
|
||||||
*/
|
*/
|
||||||
static std::string removeComments(const std::string &str);
|
static std::string removeComments(const std::string &str, const std::string &filename, Settings *settings);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove redundant parantheses from preprocessor commands. This should only be called from read().
|
* Remove redundant parantheses from preprocessor commands. This should only be called from read().
|
||||||
|
@ -171,7 +171,7 @@ private:
|
||||||
*/
|
*/
|
||||||
void handleIncludes(std::string &code, const std::string &filename, const std::list<std::string> &includePaths);
|
void handleIncludes(std::string &code, const std::string &filename, const std::list<std::string> &includePaths);
|
||||||
|
|
||||||
const Settings *_settings;
|
Settings *_settings;
|
||||||
ErrorLogger *_errorLogger;
|
ErrorLogger *_errorLogger;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,7 @@ Settings::Settings()
|
||||||
_showAll = false;
|
_showAll = false;
|
||||||
_checkCodingStyle = false;
|
_checkCodingStyle = false;
|
||||||
_errorsOnly = false;
|
_errorsOnly = false;
|
||||||
|
_inlineSuppressions = false;
|
||||||
_verbose = false;
|
_verbose = false;
|
||||||
_force = false;
|
_force = false;
|
||||||
_xml = false;
|
_xml = false;
|
||||||
|
|
|
@ -56,6 +56,7 @@ public:
|
||||||
bool _showAll;
|
bool _showAll;
|
||||||
bool _checkCodingStyle;
|
bool _checkCodingStyle;
|
||||||
bool _errorsOnly;
|
bool _errorsOnly;
|
||||||
|
bool _inlineSuppressions;
|
||||||
bool _verbose;
|
bool _verbose;
|
||||||
|
|
||||||
/** Force checking t he files with "too many" configurations. */
|
/** Force checking t he files with "too many" configurations. */
|
||||||
|
|
Loading…
Reference in New Issue