Skip to content

Commit ad007ca

Browse files
committed
Uninitialized variables: better checking of arrays
1 parent 1fd9ba0 commit ad007ca

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

lib/checkuninitvar.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -845,6 +845,15 @@ bool CheckUninitVar::isVariableUsage(const Token *vartok, bool pointer, Alloc al
845845
// if this is not a function parameter report this dereference as variable usage
846846
if (!functionParameter)
847847
return true;
848+
} else if (alloc == ARRAY && Token::Match(vartok, "%var% [")) {
849+
const Token *parent = vartok->next()->astParent();
850+
while (Token::simpleMatch(parent, "["))
851+
parent = parent->astParent();
852+
if (Token::simpleMatch(parent, "&") && !parent->astOperand2())
853+
return false;
854+
if (Token::Match(parent, "[=,(]"))
855+
return false;
856+
return true;
848857
}
849858

850859
if (_tokenizer->isCPP() && Token::Match(vartok->next(), "<<|>>")) {

test/testuninitvar.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1407,13 +1407,19 @@ class TestUninitVar : public TestFixture {
14071407
" int a[1];\n"
14081408
" return a[0];\n"
14091409
"}");
1410-
TODO_ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: a\n", "", errout.str());
1410+
ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: a\n", errout.str());
14111411

14121412
checkUninitVar("int foo() {\n"
14131413
" int a[2][2];\n"
14141414
" return a[0][1];\n"
14151415
"}");
1416-
TODO_ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: a\n", "", errout.str());
1416+
ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: a\n", errout.str());
1417+
1418+
checkUninitVar("int foo() {\n"
1419+
" int a[10];\n"
1420+
" dostuff(a[0]);\n"
1421+
"}");
1422+
ASSERT_EQUALS("", errout.str());
14171423

14181424
// # 4740
14191425
checkUninitVar("void f() {\n"

0 commit comments

Comments
 (0)