Skip to content

Commit a2e709a

Browse files
committed
Uninitialized variables; Try to remove heuristics for assignment with overloaded <<. That is non-standard behavior for the << operator. Let's see how much FPs we get.
1 parent 3a498de commit a2e709a

File tree

2 files changed

+9
-30
lines changed

2 files changed

+9
-30
lines changed

lib/checkuninitvar.cpp

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1242,21 +1242,6 @@ const Token* CheckUninitVar::isVariableUsage(const Token *vartok, bool pointer,
12421242

12431243
if (valueExpr->valueType() && valueExpr->valueType()->type == ValueType::Type::VOID)
12441244
return nullptr;
1245-
1246-
// overloaded << operator to initialize variable?
1247-
if (Token::simpleMatch(valueExpr->astParent(), "<<") && !valueExpr->astParent()->astParent()) {
1248-
if (astIsLhs(valueExpr))
1249-
return nullptr;
1250-
const Token *lhs = valueExpr->astParent()->astOperand1();
1251-
if (Token::simpleMatch(lhs, "<<"))
1252-
return valueExpr;
1253-
if (Token::simpleMatch(lhs->previous(), "std ::"))
1254-
return valueExpr;
1255-
const Variable *var = lhs->variable();
1256-
if (var && (var->typeStartToken()->isStandardType() || var->typeStartToken()->isEnumType() || Token::simpleMatch(var->typeStartToken(), "std ::")))
1257-
return valueExpr;
1258-
return nullptr;
1259-
}
12601245
}
12611246
if (astIsRhs(derefValue) && isLikelyStreamRead(mTokenizer->isCPP(), derefValue->astParent()))
12621247
return nullptr;

test/testuninitvar.cpp

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -450,10 +450,10 @@ class TestUninitVar : public TestFixture {
450450

451451
checkUninitVar("int a(FArchive &arc) {\n" // #3060 (initialization through operator<<)
452452
" int *p;\n"
453-
" arc << p;\n"
453+
" arc << p;\n" // <- TODO initialization?
454454
" return *p;\n"
455455
"}");
456-
ASSERT_EQUALS("", errout.str());
456+
ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: p\n", errout.str());
457457

458458
checkUninitVar("void a() {\n"
459459
" int ret;\n"
@@ -462,13 +462,13 @@ class TestUninitVar : public TestFixture {
462462
"test.c");
463463
ASSERT_EQUALS("[test.c:3]: (error) Uninitialized variable: ret\n", errout.str());
464464

465-
// #4320
465+
// #4320 says this is a FP. << is overloaded.
466466
checkUninitVar("int f() {\n"
467467
" int a;\n"
468-
" a << 1;\n"
468+
" a << 1;\n" // <- TODO initialization?
469469
" return a;\n"
470470
"}");
471-
ASSERT_EQUALS("", errout.str());
471+
ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: a\n", errout.str());
472472

473473
// #4673
474474
checkUninitVar("void f() {\n"
@@ -2871,13 +2871,6 @@ class TestUninitVar : public TestFixture {
28712871
" char a = c << 2;\n"
28722872
"}");
28732873
ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: c\n", errout.str());
2874-
2875-
// #4320
2876-
checkUninitVar("void f() {\n"
2877-
" int a;\n"
2878-
" a << 1;\n" // there might be a operator<<
2879-
"}");
2880-
ASSERT_EQUALS("", errout.str());
28812874
}
28822875

28832876
void uninitvar8() {
@@ -4476,10 +4469,11 @@ class TestUninitVar : public TestFixture {
44764469

44774470
valueFlowUninit("int a(FArchive &arc) {\n" // #3060 (initialization through operator<<)
44784471
" int *p;\n"
4479-
" arc << p;\n"
4480-
" return *p;\n" // fp: should not warn
4472+
" arc << p;\n" // <- TODO initialization?
4473+
" return *p;\n"
44814474
"}");
4482-
TODO_ASSERT_EQUALS("", "[test.cpp:4]: (error) Uninitialized variable: p\n", errout.str());
4475+
ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: p\n"
4476+
"[test.cpp:4]: (error) Uninitialized variable: p\n", errout.str());
44834477

44844478
// #4320
44854479
valueFlowUninit("void f() {\n"

0 commit comments

Comments
 (0)