Skip to content

Commit 6ddd0a9

Browse files
committed
Fixed danmar#6917 (False positive uninitvar - unused array declaration and ternary expression)
1 parent d7d1133 commit 6ddd0a9

File tree

2 files changed

+20
-12
lines changed

2 files changed

+20
-12
lines changed

lib/checkuninitvar.cpp

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -220,18 +220,20 @@ static bool isVariableUsed(const Token *tok, const Variable& var)
220220
return false;
221221
if (tok->isConstOp())
222222
return isVariableUsed(tok->astOperand1(),var) || isVariableUsed(tok->astOperand2(),var);
223-
if (var.isArray()) {
224-
const Token *parent = tok->astParent();
225-
while (Token::Match(parent, "[?:]"))
226-
parent = parent->astParent();
227-
// no dereference, then array is not "used"
228-
if (!Token::Match(parent, "*|["))
229-
return false;
230-
const Token *parent2 = parent->astParent();
231-
// TODO: handle function calls. There is a TODO assertion in TestUninitVar::uninitvar_arrays
232-
return !parent2 || parent2->isConstOp() || (parent2->str() == "=" && parent2->astOperand2() == parent);
233-
}
234-
return (tok->varId() == var.declarationId());
223+
if (tok->varId() != var.declarationId())
224+
return false;
225+
if (!var.isArray())
226+
return true;
227+
228+
const Token *parent = tok->astParent();
229+
while (Token::Match(parent, "[?:]"))
230+
parent = parent->astParent();
231+
// no dereference, then array is not "used"
232+
if (!Token::Match(parent, "*|["))
233+
return false;
234+
const Token *parent2 = parent->astParent();
235+
// TODO: handle function calls. There is a TODO assertion in TestUninitVar::uninitvar_arrays
236+
return !parent2 || parent2->isConstOp() || (parent2->str() == "=" && parent2->astOperand2() == parent);
235237
}
236238

237239
bool CheckUninitVar::checkScopeForVariable(const Token *tok, const Variable& var, bool * const possibleInit, bool * const noreturn, Alloc* const alloc, const std::string &membervar)

test/testuninitvar.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1281,6 +1281,12 @@ class TestUninitVar : public TestFixture {
12811281
"}");
12821282
TODO_ASSERT_EQUALS("error", "", errout.str());
12831283

1284+
checkUninitVar("void f(int x) {\n"
1285+
" int a[2];\n"
1286+
" y *= (x ? 1 : 2);\n"
1287+
"}");
1288+
ASSERT_EQUALS("", errout.str());
1289+
12841290
// passing array to library functions
12851291
checkUninitVar("void f()\n"
12861292
"{\n"

0 commit comments

Comments
 (0)