Skip to content

Commit 72a3617

Browse files
Fix #12142 FP uninitStructMember, unreadVariable with pointer to member (#5618)
1 parent fa7891e commit 72a3617

4 files changed

Lines changed: 28 additions & 0 deletions

File tree

lib/checkuninitvar.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -697,6 +697,11 @@ bool CheckUninitVar::checkScopeForVariable(const Token *tok, const Variable& var
697697
return true;
698698
}
699699

700+
// bailout if there is a pointer to member
701+
if (Token::Match(tok, "%varid% . *", var.declarationId())) {
702+
return true;
703+
}
704+
700705
if (tok->str() == "?") {
701706
if (!tok->astOperand2())
702707
return true;

lib/fwdanalysis.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,8 @@ bool FwdAnalysis::possiblyAliased(const Token *expr, const Token *startToken) co
500500
{
501501
if (expr->isUnaryOp("*") && !expr->astOperand1()->isUnaryOp("&"))
502502
return true;
503+
if (Token::simpleMatch(expr, ". *"))
504+
return true;
503505

504506
const bool macro = false;
505507
const bool pure = false;

test/testuninitvar.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4875,6 +4875,15 @@ class TestUninitVar : public TestFixture {
48754875
" return s;\n"
48764876
"}");
48774877
ASSERT_EQUALS("", errout.str());
4878+
4879+
checkUninitVar("struct S { int i; };\n" // #12142
4880+
"int f() {\n"
4881+
" S s;\n"
4882+
" int S::* p = &S::i;\n"
4883+
" s.*p = 123;\n"
4884+
" return s.i;\n"
4885+
"}\n");
4886+
ASSERT_EQUALS("", errout.str());
48784887
}
48794888

48804889
void uninitvar2_while() {

test/testunusedvar.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,7 @@ class TestUnusedVar : public TestFixture {
201201
TEST_CASE(localvarStruct11); // 10095
202202
TEST_CASE(localvarStruct12); // #10495
203203
TEST_CASE(localvarStruct13); // #10398
204+
TEST_CASE(localvarStruct14);
204205
TEST_CASE(localvarStructArray);
205206
TEST_CASE(localvarUnion1);
206207

@@ -5330,6 +5331,17 @@ class TestUnusedVar : public TestFixture {
53305331
ASSERT_EQUALS("", errout.str());
53315332
}
53325333

5334+
void localvarStruct14() { // #12142
5335+
functionVariableUsage("struct S { int i; };\n"
5336+
"int f() {\n"
5337+
" S s;\n"
5338+
" int S::* p = &S::i;\n"
5339+
" s.*p = 123;\n"
5340+
" return s.i;\n"
5341+
"}\n");
5342+
ASSERT_EQUALS("", errout.str());
5343+
}
5344+
53335345
void localvarStructArray() {
53345346
// extracttests.start: struct X {int a;};
53355347

0 commit comments

Comments
 (0)