Skip to content

Commit 77157a6

Browse files
authored
Fix 12033: false negative: uninitialized data passed as const data to function (#5747)
1 parent 2af3b7b commit 77157a6

3 files changed

Lines changed: 19 additions & 9 deletions

File tree

lib/astutils.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2651,8 +2651,11 @@ bool isVariableChanged(const Token *tok, int indirect, const Settings *settings,
26512651
const Token * ptok = tok2;
26522652
while (Token::Match(ptok->astParent(), ".|::|["))
26532653
ptok = ptok->astParent();
2654+
int pindirect = indirect;
2655+
if (indirect == 0 && astIsLHS(tok2) && Token::Match(ptok, ". %var%") && astIsPointer(ptok->next()))
2656+
pindirect = 1;
26542657
bool inconclusive = false;
2655-
bool isChanged = isVariableChangedByFunctionCall(ptok, indirect, settings, &inconclusive);
2658+
bool isChanged = isVariableChangedByFunctionCall(ptok, pindirect, settings, &inconclusive);
26562659
isChanged |= inconclusive;
26572660
if (isChanged)
26582661
return true;
@@ -3257,6 +3260,8 @@ static ExprUsage getFunctionUsage(const Token* tok, int indirect, const Settings
32573260
continue;
32583261
if (arg->isReference())
32593262
return ExprUsage::PassedByReference;
3263+
if (arg->isPointer() && indirect == 1)
3264+
return ExprUsage::PassedByReference;
32603265
}
32613266
if (!args.empty() && indirect == 0 && !addressOf)
32623267
return ExprUsage::Used;
@@ -3301,6 +3306,8 @@ ExprUsage getExprUsage(const Token* tok, int indirect, const Settings* settings,
33013306
parent = parent->astParent();
33023307
if (Token::Match(parent, "%assign%") && (astIsRHS(tok) || astIsLHS(parent->astOperand1())))
33033308
return ExprUsage::NotUsed;
3309+
if (Token::Match(parent, "++|--"))
3310+
return ExprUsage::NotUsed;
33043311
if (parent->isConstOp())
33053312
return ExprUsage::NotUsed;
33063313
if (parent->isCast())

lib/checkuninitvar.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1642,12 +1642,7 @@ void CheckUninitVar::valueFlowUninit()
16421642
const bool isarray = tok->variable()->isArray();
16431643
if (isarray && tok->variable()->isMember())
16441644
continue; // Todo: this is a bailout
1645-
const bool ispointer = astIsPointer(tok) && !isarray;
16461645
const bool deref = CheckNullPointer::isPointerDeRef(tok, unknown, mSettings);
1647-
if (ispointer && v->indirect == 1 && !deref)
1648-
continue;
1649-
if (isarray && !deref)
1650-
continue;
16511646
uninitderef = deref && v->indirect == 0;
16521647
const bool isleaf = isLeafDot(tok) || uninitderef;
16531648
if (!isleaf && Token::Match(tok->astParent(), ". %name%") && (tok->astParent()->next()->varId() || tok->astParent()->next()->isEnumerator()))

test/testuninitvar.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6313,7 +6313,7 @@ class TestUninitVar : public TestFixture {
63136313
" f(a, b);\n"
63146314
" printf(\"%s\", a);\n"
63156315
"}");
6316-
ASSERT_EQUALS("[test.cpp:5]: (error) Uninitialized variable: a\n", errout.str());
6316+
ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: a\n", errout.str());
63176317

63186318
valueFlowUninit("void usage(const char *);\n" // #10330
63196319
"int main(int argc, char* argv[]) {\n"
@@ -6334,6 +6334,14 @@ class TestUninitVar : public TestFixture {
63346334
" if (pwd == NULL) {}\n"
63356335
"}");
63366336
ASSERT_EQUALS("[test.cpp:15] -> [test.cpp:17]: (warning) Uninitialized variable: pwd\n", errout.str());
6337+
6338+
// #12033
6339+
valueFlowUninit("void g(const char*p);\n"
6340+
"void f() {\n"
6341+
" char buf[10];\n"
6342+
" g(buf);\n"
6343+
"}\n");
6344+
ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: buf\n", errout.str());
63376345
}
63386346

63396347
void valueFlowUninitBreak() { // Do not show duplicate warnings about the same uninitialized value
@@ -6385,7 +6393,7 @@ class TestUninitVar : public TestFixture {
63856393
" someType_t gVar;\n"
63866394
" bar(&gVar);\n"
63876395
"}");
6388-
ASSERT_EQUALS("[test.cpp:9] -> [test.cpp:5]: (warning) Uninitialized variable: p->flags\n", errout.str());
6396+
ASSERT_EQUALS("[test.cpp:9]: (error) Uninitialized variable: &gVar\n", errout.str());
63896397

63906398
valueFlowUninit("typedef struct\n"
63916399
"{\n"
@@ -6917,7 +6925,7 @@ class TestUninitVar : public TestFixture {
69176925
" foo(123, &abc);\n"
69186926
" return abc.b;\n"
69196927
"}");
6920-
ASSERT_EQUALS("[test.cpp:6]: (error) Uninitialized variable: abc.b\n", errout.str());
6928+
ASSERT_EQUALS("[test.cpp:5]: (error) Uninitialized variable: &abc\n", errout.str());
69216929

69226930
valueFlowUninit("struct ABC { int a; int b; int c; };\n"
69236931
"void foo() {\n"

0 commit comments

Comments
 (0)