Skip to content

Commit 55c2b75

Browse files
chrchr-githubchrchr-github
and
chrchr-github
authored
Fix danmar#6933 FN uninitvar with POD struct and STL types (danmar#5713)
Co-authored-by: chrchr-github <chrchr@github>
1 parent 3272a2b commit 55c2b75

File tree

4 files changed

+31
-1
lines changed

4 files changed

+31
-1
lines changed

lib/astutils.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3257,6 +3257,11 @@ static ExprUsage getFunctionUsage(const Token* tok, int indirect, const Settings
32573257
return ExprUsage::Used;
32583258
} else if (ftok->str() == "{") {
32593259
return indirect == 0 ? ExprUsage::Used : ExprUsage::Inconclusive;
3260+
} else if (ftok->variable() && ftok == ftok->variable()->nameToken()) { // variable init/constructor call
3261+
if (ftok->variable()->type() && ftok->variable()->type()->needInitialization == Type::NeedInitialization::True)
3262+
return ExprUsage::Used;
3263+
if (ftok->variable()->isStlType() || (ftok->variable()->valueType() && ftok->variable()->valueType()->container)) // STL types or containers don't initialize external variables
3264+
return ExprUsage::Used;
32603265
} else {
32613266
const bool isnullbad = settings->library.isnullargbad(ftok, argnr + 1);
32623267
if (indirect == 0 && astIsPointer(tok) && !addressOf && isnullbad)

test/cfg/qt.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,13 @@ void duplicateExpression_QString_Compare(QString style) //#8723
321321
{}
322322
}
323323

324+
void QVector_uninit()
325+
{
326+
int i;
327+
// cppcheck-suppress [uninitvar, unreadVariable]
328+
QVector<int> v(i);
329+
}
330+
324331
void QStack1(QStack<int> intStackArg)
325332
{
326333
for (int i = 0; i <= intStackArg.size(); ++i) {

test/cfg/std.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1043,8 +1043,8 @@ void uninitvar_isxdigit(void)
10431043
void uninitvar_proj(void)
10441044
{
10451045
double d;
1046+
// cppcheck-suppress uninitvar
10461047
const std::complex<double> dc(d,d);
1047-
// TODO cppcheck-suppress uninitvar
10481048
(void)std::proj(dc);
10491049
}
10501050

test/testuninitvar.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7251,6 +7251,24 @@ class TestUninitVar : public TestFixture {
72517251
"[test.cpp:23]: (error) Uninitialized variable: s.t.j\n"
72527252
"[test.cpp:27]: (error) Uninitialized variable: s.t.j\n",
72537253
errout.str());
7254+
7255+
valueFlowUninit("struct S { int x; };\n"
7256+
"void f() {\n"
7257+
" int i;\n"
7258+
" S s(i);\n"
7259+
"}\n"
7260+
"void g() {\n"
7261+
" int i;\n"
7262+
" S t{ i };\n"
7263+
"}\n"
7264+
"void h() {\n"
7265+
" int i;\n"
7266+
" std::vector<int> v(i);\n"
7267+
"}\n");
7268+
ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: i\n"
7269+
"[test.cpp:8]: (error) Uninitialized variable: i\n"
7270+
"[test.cpp:12]: (error) Uninitialized variable: i\n",
7271+
errout.str());
72547272
}
72557273

72567274
void uninitvar_memberfunction() {

0 commit comments

Comments
 (0)