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.
This commit is contained in:
parent
3a498de306
commit
a2e709a652
|
@ -1242,21 +1242,6 @@ const Token* CheckUninitVar::isVariableUsage(const Token *vartok, bool pointer,
|
||||||
|
|
||||||
if (valueExpr->valueType() && valueExpr->valueType()->type == ValueType::Type::VOID)
|
if (valueExpr->valueType() && valueExpr->valueType()->type == ValueType::Type::VOID)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
// overloaded << operator to initialize variable?
|
|
||||||
if (Token::simpleMatch(valueExpr->astParent(), "<<") && !valueExpr->astParent()->astParent()) {
|
|
||||||
if (astIsLhs(valueExpr))
|
|
||||||
return nullptr;
|
|
||||||
const Token *lhs = valueExpr->astParent()->astOperand1();
|
|
||||||
if (Token::simpleMatch(lhs, "<<"))
|
|
||||||
return valueExpr;
|
|
||||||
if (Token::simpleMatch(lhs->previous(), "std ::"))
|
|
||||||
return valueExpr;
|
|
||||||
const Variable *var = lhs->variable();
|
|
||||||
if (var && (var->typeStartToken()->isStandardType() || var->typeStartToken()->isEnumType() || Token::simpleMatch(var->typeStartToken(), "std ::")))
|
|
||||||
return valueExpr;
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (astIsRhs(derefValue) && isLikelyStreamRead(mTokenizer->isCPP(), derefValue->astParent()))
|
if (astIsRhs(derefValue) && isLikelyStreamRead(mTokenizer->isCPP(), derefValue->astParent()))
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
|
@ -450,10 +450,10 @@ private:
|
||||||
|
|
||||||
checkUninitVar("int a(FArchive &arc) {\n" // #3060 (initialization through operator<<)
|
checkUninitVar("int a(FArchive &arc) {\n" // #3060 (initialization through operator<<)
|
||||||
" int *p;\n"
|
" int *p;\n"
|
||||||
" arc << p;\n"
|
" arc << p;\n" // <- TODO initialization?
|
||||||
" return *p;\n"
|
" return *p;\n"
|
||||||
"}");
|
"}");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: p\n", errout.str());
|
||||||
|
|
||||||
checkUninitVar("void a() {\n"
|
checkUninitVar("void a() {\n"
|
||||||
" int ret;\n"
|
" int ret;\n"
|
||||||
|
@ -462,13 +462,13 @@ private:
|
||||||
"test.c");
|
"test.c");
|
||||||
ASSERT_EQUALS("[test.c:3]: (error) Uninitialized variable: ret\n", errout.str());
|
ASSERT_EQUALS("[test.c:3]: (error) Uninitialized variable: ret\n", errout.str());
|
||||||
|
|
||||||
// #4320
|
// #4320 says this is a FP. << is overloaded.
|
||||||
checkUninitVar("int f() {\n"
|
checkUninitVar("int f() {\n"
|
||||||
" int a;\n"
|
" int a;\n"
|
||||||
" a << 1;\n"
|
" a << 1;\n" // <- TODO initialization?
|
||||||
" return a;\n"
|
" return a;\n"
|
||||||
"}");
|
"}");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: a\n", errout.str());
|
||||||
|
|
||||||
// #4673
|
// #4673
|
||||||
checkUninitVar("void f() {\n"
|
checkUninitVar("void f() {\n"
|
||||||
|
@ -2871,13 +2871,6 @@ private:
|
||||||
" char a = c << 2;\n"
|
" char a = c << 2;\n"
|
||||||
"}");
|
"}");
|
||||||
ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: c\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: c\n", errout.str());
|
||||||
|
|
||||||
// #4320
|
|
||||||
checkUninitVar("void f() {\n"
|
|
||||||
" int a;\n"
|
|
||||||
" a << 1;\n" // there might be a operator<<
|
|
||||||
"}");
|
|
||||||
ASSERT_EQUALS("", errout.str());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void uninitvar8() {
|
void uninitvar8() {
|
||||||
|
@ -4476,10 +4469,11 @@ private:
|
||||||
|
|
||||||
valueFlowUninit("int a(FArchive &arc) {\n" // #3060 (initialization through operator<<)
|
valueFlowUninit("int a(FArchive &arc) {\n" // #3060 (initialization through operator<<)
|
||||||
" int *p;\n"
|
" int *p;\n"
|
||||||
" arc << p;\n"
|
" arc << p;\n" // <- TODO initialization?
|
||||||
" return *p;\n" // fp: should not warn
|
" return *p;\n"
|
||||||
"}");
|
"}");
|
||||||
TODO_ASSERT_EQUALS("", "[test.cpp:4]: (error) Uninitialized variable: p\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: p\n"
|
||||||
|
"[test.cpp:4]: (error) Uninitialized variable: p\n", errout.str());
|
||||||
|
|
||||||
// #4320
|
// #4320
|
||||||
valueFlowUninit("void f() {\n"
|
valueFlowUninit("void f() {\n"
|
||||||
|
|
Loading…
Reference in New Issue