Uninitialized variables: better handling of initialization with >>. Ticket: #3369
This commit is contained in:
parent
b3c35d4b32
commit
3a432fa959
|
@ -1130,10 +1130,6 @@ bool CheckUninitVar::checkScopeForVariable(const Token *tok, const unsigned int
|
|||
|
||||
// variable is seen..
|
||||
if (tok->varId() == varid) {
|
||||
// Assign variable
|
||||
if (tok->previous()->str() == ">>" || tok->next()->str() == "=")
|
||||
return true;
|
||||
|
||||
// Use variable
|
||||
if (isVariableUsage(tok))
|
||||
uninitvarError(tok, tok->str());
|
||||
|
@ -1156,6 +1152,11 @@ bool CheckUninitVar::isVariableUsage(const Token *vartok) const
|
|||
return true;
|
||||
|
||||
if (Token::Match(vartok->previous(), "++|--|%op%")) {
|
||||
if (vartok->previous()->str() == ">>" && _tokenizer->isCPP()) {
|
||||
// assume that variable is initialized
|
||||
return false;
|
||||
}
|
||||
|
||||
if (vartok->previous()->str() != "&" || !Token::Match(vartok->tokAt(-2), "[(,]")) {
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -1682,7 +1682,7 @@ private:
|
|||
|
||||
|
||||
/** New checking that doesn't rely on ExecutionPath */
|
||||
void checkUninitVar2(const char code[]) {
|
||||
void checkUninitVar2(const char code[], const char fname[] = "test.cpp") {
|
||||
// Clear the error buffer..
|
||||
errout.str("");
|
||||
|
||||
|
@ -1691,7 +1691,7 @@ private:
|
|||
// Tokenize..
|
||||
Tokenizer tokenizer(&settings, this);
|
||||
std::istringstream istr(code);
|
||||
tokenizer.tokenize(istr, "test.cpp");
|
||||
tokenizer.tokenize(istr, fname);
|
||||
tokenizer.simplifyTokenList();
|
||||
|
||||
// Check for redundant code..
|
||||
|
@ -1732,6 +1732,20 @@ private:
|
|||
"}");
|
||||
ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: x\n", errout.str());
|
||||
|
||||
// >> => initialization / usage
|
||||
{
|
||||
const char code[] = "void f() {\n"
|
||||
" int x;\n"
|
||||
" if (i >> x) { }\n"
|
||||
"}";
|
||||
|
||||
checkUninitVar2(code, "test.cpp");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
checkUninitVar2(code, "test.c");
|
||||
ASSERT_EQUALS("[test.c:3]: (error) Uninitialized variable: x\n", errout.str());
|
||||
}
|
||||
|
||||
// conditional initialization
|
||||
checkUninitVar2("void f() {\n"
|
||||
" int x;\n"
|
||||
|
|
Loading…
Reference in New Issue