fix #2146 (uninitialized variable: false negative for 'return x ? 1 : y;')
This commit is contained in:
parent
69c3287e31
commit
bc4db75aa9
|
@ -5307,35 +5307,47 @@ void Tokenizer::simplifyConditionOperator()
|
||||||
++parlevel;
|
++parlevel;
|
||||||
else if (tok->str() == ")")
|
else if (tok->str() == ")")
|
||||||
--parlevel;
|
--parlevel;
|
||||||
else if (parlevel == 0 && Token::Match(tok, ";|{|} *| %any% = %any% ? %any% : %any% ;"))
|
else if (parlevel == 0 && (Token::Match(tok, ";|{|} *| %any% = %any% ? %any% : %any% ;") ||
|
||||||
|
Token::Match(tok, ";|{|} return %any% ? %any% : %any% ;")))
|
||||||
{
|
{
|
||||||
std::string var(tok->strAt(1));
|
std::string var(tok->strAt(1));
|
||||||
bool isPointer = false;
|
bool isPointer = false;
|
||||||
if (Token::simpleMatch(tok->next(), "*"))
|
bool isReturn = false;
|
||||||
|
int offset = 0;
|
||||||
|
if (tok->next()->str() == "*")
|
||||||
{
|
{
|
||||||
tok = tok->next();
|
tok = tok->next();
|
||||||
var += " " + tok->strAt(1);
|
var += " " + tok->strAt(1);
|
||||||
isPointer = true;
|
isPointer = true;
|
||||||
}
|
}
|
||||||
|
else if (tok->next()->str() == "return")
|
||||||
|
{
|
||||||
|
isReturn = true;
|
||||||
|
offset = -1;
|
||||||
|
}
|
||||||
|
|
||||||
const std::string condition(tok->strAt(3));
|
const std::string condition(tok->strAt(3 + offset));
|
||||||
const std::string value1(tok->strAt(5));
|
const std::string value1(tok->strAt(5 + offset));
|
||||||
const std::string value2(tok->strAt(7));
|
const std::string value2(tok->strAt(7 + offset));
|
||||||
|
|
||||||
if (isPointer)
|
if (isPointer)
|
||||||
{
|
{
|
||||||
tok = tok->previous();
|
tok = tok->previous();
|
||||||
Token::eraseTokens(tok, tok->tokAt(10));
|
Token::eraseTokens(tok, tok->tokAt(10));
|
||||||
}
|
}
|
||||||
|
else if (isReturn)
|
||||||
|
Token::eraseTokens(tok, tok->tokAt(7));
|
||||||
else
|
else
|
||||||
{
|
|
||||||
Token::eraseTokens(tok, tok->tokAt(9));
|
Token::eraseTokens(tok, tok->tokAt(9));
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Token *starttok = 0;
|
Token *starttok = 0;
|
||||||
|
|
||||||
const std::string str("if ( condition ) { var = value1 ; } else { var = value2 ; }");
|
std::string str;
|
||||||
|
if (isReturn)
|
||||||
|
str = "if ( condition ) { return value1 ; } return value2 ;";
|
||||||
|
else
|
||||||
|
str = "if ( condition ) { var = value1 ; } else { var = value2 ; }";
|
||||||
|
|
||||||
std::string::size_type pos1 = 0;
|
std::string::size_type pos1 = 0;
|
||||||
while (pos1 != std::string::npos)
|
while (pos1 != std::string::npos)
|
||||||
{
|
{
|
||||||
|
|
|
@ -479,6 +479,13 @@ private:
|
||||||
"exit:\n"
|
"exit:\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
// Ticket #2146 - False negative
|
||||||
|
checkUninitVar("int f(int x) {\n"
|
||||||
|
" int y;\n"
|
||||||
|
" return x ? 1 : y;\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("[test.cpp:2]: (error) Uninitialized variable: y\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue