Fixed a bug in Tokenizer::simplifyKnownVariables.

When we find constant variables, check if there's a usage of its reference in the code (for example: don't simplify 'f(&x)' to 'f(&100)').
This commit is contained in:
Edoardo Prezioso 2012-11-26 16:54:13 +01:00
parent bbc1747919
commit f3029ce6bb
2 changed files with 32 additions and 0 deletions

View File

@ -5805,6 +5805,18 @@ bool Tokenizer::simplifyKnownVariables()
const Token * const vartok = (tok->next() && tok->next()->str() == "const") ? tok->tokAt(2) : tok->next();
const Token * const valuetok = vartok->tokAt(2);
if (Token::Match(valuetok, "%bool%|%char%|%num%|%str% ;")) {
//check if there's not a reference usage inside the code
bool withreference = false;
for (const Token *tok2 = valuetok->tokAt(2); tok2; tok2 = tok2->next()) {
if (Token::Match(tok2,"(|[|,|{|=|return|%op% & %varid%", vartok->varId())) {
withreference = true;
break;
}
}
//don't simplify 'f(&x)' to 'f(&100)'
if (withreference)
continue;
constantValues[vartok->varId()] = valuetok->str();
// remove statement

View File

@ -2518,6 +2518,26 @@ private:
"}";
ASSERT_EQUALS(expected, tokenizeAndStringify(code, true));
}
{
//don't simplify '&x'!
const char code[] = "const char * foo ( ) {\n"
"const char x1 = 'b' ;\n"
"f ( & x1 ) ;\n"
"const char x2 = 'b' ;\n"
"f ( y , & x2 ) ;\n"
"const char x3 = 'b' ;\n"
"t = & x3 ;\n"
"const char x4 = 'b' ;\n"
"t = y + & x4 ;\n"
"const char x5 = 'b' ;\n"
"z [ & x5 ] = y ;\n"
"const char x6 = 'b' ;\n"
"v = { & x6 } ;\n"
"const char x7 = 'b' ;\n"
"return & x7 ;\n"
"}";
ASSERT_EQUALS(code, tokenizeAndStringify(code, true));
}
}
void simplifyKnownVariablesIfEq1() {