Skip to content

Commit e71ab70

Browse files
committed
Fixed danmar#6871 (False positive uninitvar - pointer to uninitialized char[])
1 parent 72706cd commit e71ab70

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-0
lines changed

lib/checkuninitvar.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,17 @@ static bool isVariableUsed(const Token *tok, const Variable& var)
218218
return false;
219219
if (tok->isConstOp())
220220
return isVariableUsed(tok->astOperand1(),var) || isVariableUsed(tok->astOperand2(),var);
221+
if (var.isArray()) {
222+
const Token *parent = tok->astParent();
223+
while (Token::Match(parent, "[?:]"))
224+
parent = parent->astParent();
225+
// no dereference, then array is not "used"
226+
if (!Token::Match(parent, "*|["))
227+
return false;
228+
const Token *parent2 = parent->astParent();
229+
// TODO: handle function calls. There is a TODO assertion in TestUninitVar::uninitvar_arrays
230+
return !parent2 || parent2->isConstOp() || (parent2->str() == "=" && parent2->astOperand2() == parent);
231+
}
221232
return (tok->varId() == var.declarationId());
222233
}
223234

test/testuninitvar.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1254,6 +1254,26 @@ class TestUninitVar : public TestFixture {
12541254
"}");
12551255
ASSERT_EQUALS("", errout.str());
12561256

1257+
// array usage in ?: (tests that the isVariableUsed() works)
1258+
checkUninitVar("void f() {\n"
1259+
" char a[10], *p;\n"
1260+
" p = c?a:0;\n"
1261+
"}");
1262+
ASSERT_EQUALS("", errout.str());
1263+
1264+
checkUninitVar("void f() {\n"
1265+
" char a[10], c;\n"
1266+
" c = *(x?a:0);\n"
1267+
"}");
1268+
ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: a\n", errout.str());
1269+
1270+
checkUninitVar("void f() {\n"
1271+
" char a[10], c;\n"
1272+
" strcpy(dest, x?a:\"\");\n"
1273+
"}");
1274+
TODO_ASSERT_EQUALS("error", "", errout.str());
1275+
1276+
// passing array to library functions
12571277
checkUninitVar("void f()\n"
12581278
"{\n"
12591279
" char c[50] = \"\";\n"

0 commit comments

Comments
 (0)