Fixed crash #6684
This commit is contained in:
parent
1b6e4589da
commit
4f00189ee1
|
@ -1136,7 +1136,7 @@ std::string Preprocessor::getdef(std::string line, bool def)
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Simplify variable in variable map. */
|
/** Simplify variable in variable map. */
|
||||||
static Token *simplifyVarMapExpandValue(Token *tok, const std::map<std::string, std::string> &variables, std::set<std::string> seenVariables)
|
static Token *simplifyVarMapExpandValue(Token *tok, const std::map<std::string, std::string> &variables, std::set<std::string> seenVariables, const Settings* settings)
|
||||||
{
|
{
|
||||||
// TODO: handle function-macros too.
|
// TODO: handle function-macros too.
|
||||||
|
|
||||||
|
@ -1147,13 +1147,13 @@ static Token *simplifyVarMapExpandValue(Token *tok, const std::map<std::string,
|
||||||
|
|
||||||
const std::map<std::string, std::string>::const_iterator it = variables.find(tok->str());
|
const std::map<std::string, std::string>::const_iterator it = variables.find(tok->str());
|
||||||
if (it != variables.end()) {
|
if (it != variables.end()) {
|
||||||
TokenList tokenList(nullptr);
|
TokenList tokenList(settings);
|
||||||
std::istringstream istr(it->second);
|
std::istringstream istr(it->second);
|
||||||
if (tokenList.createTokens(istr)) {
|
if (tokenList.createTokens(istr)) {
|
||||||
// expand token list
|
// expand token list
|
||||||
for (Token *tok2 = tokenList.front(); tok2; tok2 = tok2->next()) {
|
for (Token *tok2 = tokenList.front(); tok2; tok2 = tok2->next()) {
|
||||||
if (tok2->isName()) {
|
if (tok2->isName()) {
|
||||||
tok2 = simplifyVarMapExpandValue(tok2, variables, seenVariables);
|
tok2 = simplifyVarMapExpandValue(tok2, variables, seenVariables, settings);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1175,16 +1175,16 @@ static Token *simplifyVarMapExpandValue(Token *tok, const std::map<std::string,
|
||||||
* Simplifies the variable map. For example if the map contains A=>B, B=>1, then A=>B is simplified to A=>1.
|
* Simplifies the variable map. For example if the map contains A=>B, B=>1, then A=>B is simplified to A=>1.
|
||||||
* @param [in,out] variables - a map of variable name to variable value. This map will be modified.
|
* @param [in,out] variables - a map of variable name to variable value. This map will be modified.
|
||||||
*/
|
*/
|
||||||
static void simplifyVarMap(std::map<std::string, std::string> &variables)
|
static void simplifyVarMap(std::map<std::string, std::string> &variables, const Settings* settings)
|
||||||
{
|
{
|
||||||
for (std::map<std::string, std::string>::iterator i = variables.begin(); i != variables.end(); ++i) {
|
for (std::map<std::string, std::string>::iterator i = variables.begin(); i != variables.end(); ++i) {
|
||||||
TokenList tokenList(nullptr);
|
TokenList tokenList(settings);
|
||||||
std::istringstream istr(i->second);
|
std::istringstream istr(i->second);
|
||||||
if (tokenList.createTokens(istr)) {
|
if (tokenList.createTokens(istr)) {
|
||||||
for (Token *tok = tokenList.front(); tok; tok = tok->next()) {
|
for (Token *tok = tokenList.front(); tok; tok = tok->next()) {
|
||||||
if (tok->isName()) {
|
if (tok->isName()) {
|
||||||
std::set<std::string> seenVariables;
|
std::set<std::string> seenVariables;
|
||||||
tok = simplifyVarMapExpandValue(tok, variables, seenVariables);
|
tok = simplifyVarMapExpandValue(tok, variables, seenVariables, settings);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1742,7 +1742,7 @@ bool Preprocessor::match_cfg_def(std::map<std::string, std::string> cfg, std::st
|
||||||
std::cout << "def: \"" << def << "\"\n";
|
std::cout << "def: \"" << def << "\"\n";
|
||||||
*/
|
*/
|
||||||
|
|
||||||
simplifyVarMap(cfg);
|
simplifyVarMap(cfg, _settings);
|
||||||
simplifyCondition(cfg, def, true);
|
simplifyCondition(cfg, def, true);
|
||||||
|
|
||||||
if (cfg.find(def) != cfg.end())
|
if (cfg.find(def) != cfg.end())
|
||||||
|
|
|
@ -297,7 +297,9 @@ private:
|
||||||
TEST_CASE(if_sizeof);
|
TEST_CASE(if_sizeof);
|
||||||
|
|
||||||
TEST_CASE(double_include); // #5717
|
TEST_CASE(double_include); // #5717
|
||||||
TEST_CASE(invalid_ifs)// #5909
|
TEST_CASE(invalid_ifs); // #5909
|
||||||
|
|
||||||
|
TEST_CASE(garbage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -4067,7 +4069,19 @@ private:
|
||||||
Settings settings;
|
Settings settings;
|
||||||
Preprocessor preprocessor(&settings, this);
|
Preprocessor preprocessor(&settings, this);
|
||||||
preprocessor.preprocess(istr, actual, "file.c");
|
preprocessor.preprocess(istr, actual, "file.c");
|
||||||
|
}
|
||||||
|
|
||||||
|
void garbage() {
|
||||||
|
const char filedata[] = "V\n"
|
||||||
|
"#define X b #endif #line 0 \"x\" ;\n"
|
||||||
|
"#if ! defined ( Y ) #endif";
|
||||||
|
|
||||||
|
// Preprocess => don't crash..
|
||||||
|
std::istringstream istr(filedata);
|
||||||
|
std::map<std::string, std::string> actual;
|
||||||
|
Settings settings;
|
||||||
|
Preprocessor preprocessor(&settings, this);
|
||||||
|
preprocessor.preprocess(istr, actual, "file.c");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue