Bug hunting: Avoid uninit struct member false positives

This commit is contained in:
Daniel Marjamäki 2020-09-09 18:26:04 +02:00
parent f95a53b0ca
commit 7c8c0ef3a2
2 changed files with 12 additions and 1 deletions

View File

@ -2512,7 +2512,7 @@ static ExprEngine::ValuePtr createStructVal(const Scope *structScope, bool unini
std::shared_ptr<ExprEngine::StructValue> structValue = std::make_shared<ExprEngine::StructValue>(data.getNewSymbolName()); std::shared_ptr<ExprEngine::StructValue> structValue = std::make_shared<ExprEngine::StructValue>(data.getNewSymbolName());
auto uninitValue = std::make_shared<ExprEngine::UninitValue>(); auto uninitValue = std::make_shared<ExprEngine::UninitValue>();
for (const Variable &member : structScope->varlist) { for (const Variable &member : structScope->varlist) {
if (uninitData) { if (uninitData && !member.isInit()) {
if (member.isPointer()) { if (member.isPointer()) {
structValue->member[member.name()] = uninitValue; structValue->member[member.name()] = uninitValue;
continue; continue;

View File

@ -44,6 +44,7 @@ private:
TEST_CASE(uninit_bailout); TEST_CASE(uninit_bailout);
TEST_CASE(uninit_fp_smartptr); TEST_CASE(uninit_fp_smartptr);
TEST_CASE(uninit_fp_struct); TEST_CASE(uninit_fp_struct);
TEST_CASE(uninit_fp_struct_member_init_2);
TEST_CASE(uninit_fp_template_var); TEST_CASE(uninit_fp_template_var);
TEST_CASE(ctu); TEST_CASE(ctu);
#endif #endif
@ -202,6 +203,16 @@ private:
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
} }
void uninit_fp_struct_member_init_2() {
check("struct A {\n"
" int x {0}; int y {0};\n"
"};\n"
"void foo(const A& a) {\n"
" bar(a);\n"
"}");
ASSERT_EQUALS("", errout.str());
}
void uninit_fp_template_var() { void uninit_fp_template_var() {
check("void foo() {\n" check("void foo() {\n"
" X*x = DYNAMIC_CAST(X, p);\n" " X*x = DYNAMIC_CAST(X, p);\n"