Fixed #4868 (Segmentation fault in Preprocessor::handleIncludes())
This commit is contained in:
parent
e4270bab78
commit
bfc40ffe9f
|
@ -1970,15 +1970,15 @@ std::string Preprocessor::handleIncludes(const std::string &code, const std::str
|
||||||
if (indent == indentmatch + 1)
|
if (indent == indentmatch + 1)
|
||||||
elseIsTrue = true;
|
elseIsTrue = true;
|
||||||
|
|
||||||
} else if (!suppressCurrentCodePath && line.compare(0,4,"#if ") == 0) {
|
} else if (line.compare(0,4,"#if ") == 0) {
|
||||||
if (indent == indentmatch && match_cfg_def(defs, line.substr(4))) {
|
if (!suppressCurrentCodePath && indent == indentmatch && match_cfg_def(defs, line.substr(4))) {
|
||||||
elseIsTrue = false;
|
elseIsTrue = false;
|
||||||
indentmatch++;
|
indentmatch++;
|
||||||
}
|
}
|
||||||
++indent;
|
++indent;
|
||||||
|
|
||||||
if (indent == indentmatch + 1)
|
if (indent == indentmatch + 1)
|
||||||
elseIsTrue = true;
|
elseIsTrue = true; // this value doesn't matter when suppressCurrentCodePath is true
|
||||||
} else if (line.compare(0,6,"#elif ") == 0 || line.compare(0,5,"#else") == 0) {
|
} else if (line.compare(0,6,"#elif ") == 0 || line.compare(0,5,"#else") == 0) {
|
||||||
if (!elseIsTrue) {
|
if (!elseIsTrue) {
|
||||||
if (indentmatch == indent) {
|
if (indentmatch == indent) {
|
||||||
|
@ -1994,10 +1994,6 @@ std::string Preprocessor::handleIncludes(const std::string &code, const std::str
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (suppressCurrentCodePath) {
|
|
||||||
suppressCurrentCodePath = false;
|
|
||||||
indentmatch = indent;
|
|
||||||
}
|
|
||||||
} else if (line.compare(0, 6, "#endif") == 0) {
|
} else if (line.compare(0, 6, "#endif") == 0) {
|
||||||
if (indent > 0)
|
if (indent > 0)
|
||||||
--indent;
|
--indent;
|
||||||
|
|
|
@ -268,6 +268,7 @@ private:
|
||||||
TEST_CASE(def_missingInclude);
|
TEST_CASE(def_missingInclude);
|
||||||
TEST_CASE(def_handleIncludes_ifelse1); // problems in handleIncludes for #else
|
TEST_CASE(def_handleIncludes_ifelse1); // problems in handleIncludes for #else
|
||||||
TEST_CASE(def_handleIncludes_ifelse2);
|
TEST_CASE(def_handleIncludes_ifelse2);
|
||||||
|
TEST_CASE(def_handleIncludes_ifelse3); // #4868 - crash
|
||||||
|
|
||||||
TEST_CASE(def_valueWithParentheses); // #3531
|
TEST_CASE(def_valueWithParentheses); // #3531
|
||||||
|
|
||||||
|
@ -3510,6 +3511,25 @@ private:
|
||||||
preprocessor.handleIncludes(code, "test.c", includePaths, defs).find("123"));
|
preprocessor.handleIncludes(code, "test.c", includePaths, defs).find("123"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void def_handleIncludes_ifelse3() { // #4865
|
||||||
|
const char code[] = "#ifdef A\n"
|
||||||
|
"#if defined(SOMETHING_NOT_DEFINED)\n"
|
||||||
|
"#else\n"
|
||||||
|
"#endif\n"
|
||||||
|
"#else\n"
|
||||||
|
"#endif";
|
||||||
|
|
||||||
|
Settings settings;
|
||||||
|
settings.userUndefs.insert("A");
|
||||||
|
Preprocessor preprocessor(&settings, this);
|
||||||
|
|
||||||
|
const std::list<std::string> includePaths;
|
||||||
|
std::map<std::string,std::string> defs;
|
||||||
|
defs["B"] = "1";
|
||||||
|
defs["C"] = "1";
|
||||||
|
preprocessor.handleIncludes(code, "test.c", includePaths, defs); // don't crash
|
||||||
|
}
|
||||||
|
|
||||||
void def_valueWithParentheses() {
|
void def_valueWithParentheses() {
|
||||||
// #define should introduce a new symbol regardless of parentheses in the value
|
// #define should introduce a new symbol regardless of parentheses in the value
|
||||||
// and regardless of white space in weird places (people do this for some reason).
|
// and regardless of white space in weird places (people do this for some reason).
|
||||||
|
|
Loading…
Reference in New Issue