Fixed #4225 (False positive: uninitialized variable (assignemnt in ternary expression with cast))

This commit is contained in:
Daniel Marjamäki 2012-09-30 18:49:25 +02:00
parent a64669b1ec
commit 9a462d8a0a
2 changed files with 19 additions and 2 deletions

View File

@ -4226,6 +4226,14 @@ void Tokenizer::simplifyConditionOperator()
if (Token::Match(tok, "[{};] *| %var% = %any% ? %any% : %any% ;") || if (Token::Match(tok, "[{};] *| %var% = %any% ? %any% : %any% ;") ||
Token::Match(tok, "[{};] return %any% ? %any% : %any% ;")) { Token::Match(tok, "[{};] return %any% ? %any% : %any% ;")) {
// backup varids so they can be set properly
std::map<std::string, unsigned int> varid;
for (const Token *tok2 = tok->next(); tok2->str() != ";"; tok2 = tok2->next()) {
if (tok2->varId())
varid[tok2->str()] = tok2->varId();
}
std::string var(tok->next()->str()); std::string var(tok->next()->str());
bool isPointer = false; bool isPointer = false;
bool isReturn = false; bool isReturn = false;
@ -4299,6 +4307,10 @@ void Tokenizer::simplifyConditionOperator()
tok->str(value1); tok->str(value1);
else if (tok->str() == "value2") else if (tok->str() == "value2")
tok->str(value2); tok->str(value2);
// set varid.
if (varid.find(tok->str()) != varid.end())
tok->varId(varid[tok->str()]);
} }
} }
} }

View File

@ -162,7 +162,7 @@ private:
TEST_CASE(remove_comma); TEST_CASE(remove_comma);
// Simplify "?:" // Simplify "?:"
TEST_CASE(conditionOperator); TEST_CASE(simplifyConditionOperator);
// Simplify calculations // Simplify calculations
TEST_CASE(calculations); TEST_CASE(calculations);
@ -2719,7 +2719,7 @@ private:
} }
} }
void conditionOperator() { void simplifyConditionOperator() {
{ {
const char code[] = "; x = a ? b : c;"; const char code[] = "; x = a ? b : c;";
ASSERT_EQUALS("; if ( a ) { x = b ; } else { x = c ; }", tok(code)); ASSERT_EQUALS("; if ( a ) { x = b ; } else { x = c ; }", tok(code));
@ -2832,6 +2832,11 @@ private:
ASSERT_EQUALS("; x = * b ;", tok("; x = (false)?*a:*b;")); ASSERT_EQUALS("; x = * b ;", tok("; x = (false)?*a:*b;"));
ASSERT_EQUALS("void f ( ) { return 1 ; }", tok("void f() { char *p=0; return (p==0)?1:2; }")); ASSERT_EQUALS("void f ( ) { return 1 ; }", tok("void f() { char *p=0; return (p==0)?1:2; }"));
} }
// 4225 - varid gets lost
ASSERT_EQUALS("\n\n##file 0\n"
"1: int a@1 ; int b@2 ; int c@3 ; int d@4 ; if ( b@2 ) { a@1 = c@3 ; } else { a@1 = d@4 ; }\n",
tokenizeDebugListing("int a, b, c, d; a = b ? (int *)c : d;", true));
} }
void calculations() { void calculations() {