Fixed #2042 (#error messages should be displayed when user defines are used)
This commit is contained in:
parent
5a95303405
commit
aae2986361
|
@ -160,7 +160,7 @@ unsigned int CppCheck::check()
|
||||||
|
|
||||||
cfg = *it;
|
cfg = *it;
|
||||||
Timer t("Preprocessor::getcode", _settings._showtime, &S_timerResults);
|
Timer t("Preprocessor::getcode", _settings._showtime, &S_timerResults);
|
||||||
const std::string codeWithoutCfg = Preprocessor::getcode(filedata, *it, fname, &_errorLogger);
|
const std::string codeWithoutCfg = Preprocessor::getcode(filedata, *it, fname, &_settings, &_errorLogger);
|
||||||
t.Stop();
|
t.Stop();
|
||||||
|
|
||||||
// If only errors are printed, print filename after the check
|
// If only errors are printed, print filename after the check
|
||||||
|
@ -213,7 +213,7 @@ void CppCheck::analyseFile(std::istream &fin, const std::string &filename)
|
||||||
std::list<std::string> configurations;
|
std::list<std::string> configurations;
|
||||||
std::string filedata = "";
|
std::string filedata = "";
|
||||||
preprocessor.preprocess(fin, filedata, configurations, filename, _settings._includePaths);
|
preprocessor.preprocess(fin, filedata, configurations, filename, _settings._includePaths);
|
||||||
const std::string code = Preprocessor::getcode(filedata, "", filename, &_errorLogger);
|
const std::string code = Preprocessor::getcode(filedata, "", filename, &_settings, &_errorLogger);
|
||||||
|
|
||||||
// Tokenize..
|
// Tokenize..
|
||||||
Tokenizer tokenizer(&_settings, this);
|
Tokenizer tokenizer(&_settings, this);
|
||||||
|
|
|
@ -508,7 +508,7 @@ void Preprocessor::preprocess(std::istream &istr, std::map<std::string, std::str
|
||||||
std::string data;
|
std::string data;
|
||||||
preprocess(istr, data, configs, filename, includePaths);
|
preprocess(istr, data, configs, filename, includePaths);
|
||||||
for (std::list<std::string>::const_iterator it = configs.begin(); it != configs.end(); ++it)
|
for (std::list<std::string>::const_iterator it = configs.begin(); it != configs.end(); ++it)
|
||||||
result[ *it ] = Preprocessor::getcode(data, *it, filename, _errorLogger);
|
result[ *it ] = Preprocessor::getcode(data, *it, filename, _settings, _errorLogger);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Preprocessor::removeSpaceNearNL(const std::string &str)
|
std::string Preprocessor::removeSpaceNearNL(const std::string &str)
|
||||||
|
@ -1165,8 +1165,11 @@ bool Preprocessor::match_cfg_def(const std::map<std::string, std::string> &cfg,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
std::string Preprocessor::getcode(const std::string &filedata, std::string cfg, const std::string &filename, ErrorLogger *errorLogger)
|
std::string Preprocessor::getcode(const std::string &filedata, std::string cfg, const std::string &filename, const Settings *settings, ErrorLogger *errorLogger)
|
||||||
{
|
{
|
||||||
|
// For the error report
|
||||||
|
unsigned int lineno = 0;
|
||||||
|
|
||||||
std::ostringstream ret;
|
std::ostringstream ret;
|
||||||
|
|
||||||
bool match = true;
|
bool match = true;
|
||||||
|
@ -1211,6 +1214,8 @@ std::string Preprocessor::getcode(const std::string &filedata, std::string cfg,
|
||||||
std::string line;
|
std::string line;
|
||||||
while (getline(istr, line))
|
while (getline(istr, line))
|
||||||
{
|
{
|
||||||
|
++lineno;
|
||||||
|
|
||||||
if (line.compare(0, 11, "#pragma asm") == 0)
|
if (line.compare(0, 11, "#pragma asm") == 0)
|
||||||
{
|
{
|
||||||
ret << "\n";
|
ret << "\n";
|
||||||
|
@ -1310,7 +1315,15 @@ std::string Preprocessor::getcode(const std::string &filedata, std::string cfg,
|
||||||
|
|
||||||
// #error => return ""
|
// #error => return ""
|
||||||
if (match && line.compare(0, 6, "#error") == 0)
|
if (match && line.compare(0, 6, "#error") == 0)
|
||||||
|
{
|
||||||
|
if (settings && !settings->userDefines.empty())
|
||||||
|
{
|
||||||
|
std::ostringstream errmsg;
|
||||||
|
errmsg << line;
|
||||||
|
writeError(filename, lineno, errorLogger, "preprocessorErrorDirective", errmsg.str());
|
||||||
|
}
|
||||||
return "";
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
if (!match && line.compare(0, 8, "#define ") == 0)
|
if (!match && line.compare(0, 8, "#define ") == 0)
|
||||||
{
|
{
|
||||||
|
@ -2299,4 +2312,10 @@ void Preprocessor::getErrorMessages(std::ostream &ostr)
|
||||||
"Include file: \"\" not found.",
|
"Include file: \"\" not found.",
|
||||||
"missingInclude");
|
"missingInclude");
|
||||||
ostr << errmsg.toXML() << std::endl;
|
ostr << errmsg.toXML() << std::endl;
|
||||||
|
|
||||||
|
const ErrorLogger::ErrorMessage errmsg2(locationList,
|
||||||
|
Severity::error,
|
||||||
|
"#error ...",
|
||||||
|
"preprocessorErrorDirective");
|
||||||
|
ostr << errmsg2.toXML() << std::endl;
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,7 +91,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* Get preprocessed code for a given configuration
|
* Get preprocessed code for a given configuration
|
||||||
*/
|
*/
|
||||||
static std::string getcode(const std::string &filedata, std::string cfg, const std::string &filename, ErrorLogger *errorLogger);
|
static std::string getcode(const std::string &filedata, std::string cfg, const std::string &filename, const Settings *settings, ErrorLogger *errorLogger);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* simplify condition
|
* simplify condition
|
||||||
|
|
|
@ -84,6 +84,8 @@ private:
|
||||||
// #error with extended chars
|
// #error with extended chars
|
||||||
TEST_CASE(error2);
|
TEST_CASE(error2);
|
||||||
|
|
||||||
|
TEST_CASE(error3);
|
||||||
|
|
||||||
// Handling include guards (don't create extra configuration for it)
|
// Handling include guards (don't create extra configuration for it)
|
||||||
TEST_CASE(includeguard1);
|
TEST_CASE(includeguard1);
|
||||||
TEST_CASE(includeguard2);
|
TEST_CASE(includeguard2);
|
||||||
|
@ -450,6 +452,16 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void error3()
|
||||||
|
{
|
||||||
|
Settings settings;
|
||||||
|
settings.userDefines = "__cplusplus";
|
||||||
|
const std::string code("#error hello world!\n");
|
||||||
|
Preprocessor::getcode(code, "X", "test.c", &settings, this);
|
||||||
|
ASSERT_EQUALS("[test.c:1]: (error) #error hello world!\n", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void includeguard1()
|
void includeguard1()
|
||||||
{
|
{
|
||||||
// Handling include guards..
|
// Handling include guards..
|
||||||
|
@ -1120,7 +1132,7 @@ private:
|
||||||
const std::string code("#if X || Y\n"
|
const std::string code("#if X || Y\n"
|
||||||
"a1;\n"
|
"a1;\n"
|
||||||
"#endif\n");
|
"#endif\n");
|
||||||
const std::string actual = Preprocessor::getcode(code, "X", "test.c", NULL);
|
const std::string actual = Preprocessor::getcode(code, "X", "test.c", NULL, NULL);
|
||||||
ASSERT_EQUALS("\na1;\n\n", actual);
|
ASSERT_EQUALS("\na1;\n\n", actual);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1575,7 +1587,7 @@ private:
|
||||||
"int z;\n"
|
"int z;\n"
|
||||||
"z = 0;\n";
|
"z = 0;\n";
|
||||||
|
|
||||||
ASSERT_EQUALS("\n\nint z;\nz = 0;\n", OurPreprocessor::getcode(filedata, "", "", NULL));
|
ASSERT_EQUALS("\n\nint z;\nz = 0;\n", OurPreprocessor::getcode(filedata, "", "", NULL, NULL));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue