Fixed #5102 (Crash if -D is used when scanning simple preprocessor code.)
This commit is contained in:
parent
072c80bde8
commit
f8710cb984
|
@ -2052,6 +2052,11 @@ std::string Preprocessor::handleIncludes(const std::string &code, const std::str
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (elseIsTrueStack.empty()) {
|
||||||
|
writeError(filePath, linenr, _errorLogger, "syntaxError", "Syntax error in preprocessor code");
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
std::stack<bool>::reference elseIsTrue = elseIsTrueStack.top();
|
std::stack<bool>::reference elseIsTrue = elseIsTrueStack.top();
|
||||||
|
|
||||||
if (line == "#pragma once") {
|
if (line == "#pragma once") {
|
||||||
|
|
|
@ -93,6 +93,7 @@ private:
|
||||||
TEST_CASE(test7d);
|
TEST_CASE(test7d);
|
||||||
TEST_CASE(test7e);
|
TEST_CASE(test7e);
|
||||||
TEST_CASE(test8); // #if A==1 => cfg: A=1
|
TEST_CASE(test8); // #if A==1 => cfg: A=1
|
||||||
|
TEST_CASE(test9); // Don't crash for invalid code
|
||||||
|
|
||||||
// #error => don't extract any code
|
// #error => don't extract any code
|
||||||
TEST_CASE(error1);
|
TEST_CASE(error1);
|
||||||
|
@ -778,6 +779,21 @@ private:
|
||||||
ASSERT_EQUALS("\n1\n\n", actual["A=1"]);
|
ASSERT_EQUALS("\n1\n\n", actual["A=1"]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test9() {
|
||||||
|
const char filedata[] = "#if\n"
|
||||||
|
"#else\n"
|
||||||
|
"#endif\n";
|
||||||
|
|
||||||
|
// Preprocess => actual result..
|
||||||
|
std::istringstream istr(filedata);
|
||||||
|
std::map<std::string, std::string> actual;
|
||||||
|
Settings settings;
|
||||||
|
settings._maxConfigs = 1;
|
||||||
|
settings.userDefines = "X";
|
||||||
|
Preprocessor preprocessor(&settings, this);
|
||||||
|
preprocessor.preprocess(istr, actual, "file.c"); // <- don't crash
|
||||||
|
}
|
||||||
|
|
||||||
void error1() {
|
void error1() {
|
||||||
const char filedata[] = "#ifdef A\n"
|
const char filedata[] = "#ifdef A\n"
|
||||||
";\n"
|
";\n"
|
||||||
|
|
Loading…
Reference in New Issue