Skip to content

Commit 2187e8b

Browse files
committed
CheckUninitVar: Fixed FP when dereferencing multidimensional arrays. Refactoring of testing. The FP was spotted when looking at danmar#7092
1 parent 99b2301 commit 2187e8b

File tree

2 files changed

+32
-19
lines changed

2 files changed

+32
-19
lines changed

lib/checkuninitvar.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -918,9 +918,12 @@ bool CheckUninitVar::isVariableUsage(const Token *vartok, bool pointer, Alloc al
918918

919919
if (vartok->previous()->str() != "&" || !Token::Match(vartok->tokAt(-2), "[(,=?:]")) {
920920
if (alloc != NO_ALLOC && vartok->previous()->str() == "*") {
921+
// TestUninitVar::isVariableUsageDeref()
921922
const Token *parent = vartok->previous()->astParent();
922923
if (parent && parent->str() == "=" && parent->astOperand1() == vartok->previous())
923924
return false;
925+
if (vartok->variable() && vartok->variable()->dimensions().size() >= 2)
926+
return false;
924927
return true;
925928
}
926929
return alloc == NO_ALLOC;

test/testuninitvar.cpp

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ class TestUninitVar : public TestFixture {
7373
TEST_CASE(syntax_error); // Ticket #5073
7474
TEST_CASE(trac_5970);
7575

76+
TEST_CASE(isVariableUsageDeref); // *p
77+
7678
// dead pointer
7779
TEST_CASE(deadPointer);
7880
}
@@ -537,13 +539,6 @@ class TestUninitVar : public TestFixture {
537539
"}");
538540
ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: c\n", errout.str());
539541

540-
checkUninitVar("void f()\n"
541-
"{\n"
542-
" char *s = malloc(100);\n"
543-
" *s += 10;\n"
544-
"}");
545-
ASSERT_EQUALS("[test.cpp:4]: (error) Memory is allocated but not initialized: s\n", errout.str());
546-
547542
checkUninitVar("void f()\n"
548543
"{\n"
549544
" int a[10];\n"
@@ -1236,18 +1231,6 @@ class TestUninitVar : public TestFixture {
12361231
"}");
12371232
TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: a\n", "", errout.str());
12381233

1239-
checkUninitVar("int f() {\n"
1240-
" char a[10];\n"
1241-
" char c = *a;\n"
1242-
"}");
1243-
ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: a\n", errout.str());
1244-
1245-
checkUninitVar("int f() {\n"
1246-
" char a[SIZE+10];\n"
1247-
" char c = *a;\n"
1248-
"}");
1249-
ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: a\n", errout.str());
1250-
12511234
checkUninitVar("int f()\n"
12521235
"{\n"
12531236
" char a[10];\n"
@@ -3783,6 +3766,33 @@ class TestUninitVar : public TestFixture {
37833766
check.deadPointer();
37843767
}
37853768

3769+
void isVariableUsageDeref() {
3770+
// *p
3771+
checkUninitVar("void f() {\n"
3772+
" char a[10];\n"
3773+
" char c = *a;\n"
3774+
"}");
3775+
ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: a\n", errout.str());
3776+
3777+
checkUninitVar("void f() {\n"
3778+
" char a[SIZE+10];\n"
3779+
" char c = *a;\n"
3780+
"}");
3781+
ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: a\n", errout.str());
3782+
3783+
checkUninitVar("void f() {\n"
3784+
" char a[10];\n"
3785+
" *a += 10;\n"
3786+
"}");
3787+
ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: a\n", errout.str());
3788+
3789+
checkUninitVar("void f() {\n"
3790+
" int a[10][10];\n"
3791+
" dostuff(*a);\n"
3792+
"}");
3793+
ASSERT_EQUALS("", errout.str());
3794+
}
3795+
37863796
void deadPointer() {
37873797
checkDeadPointer("void f() {\n"
37883798
" int *p = p1;\n"

0 commit comments

Comments
 (0)