Skip to content

Commit

Permalink
Fixed #3919 (False positive: uninitialized variable (extern))
Browse files Browse the repository at this point in the history
  • Loading branch information
danmar committed Jun 26, 2012
1 parent 1ad56a2 commit 9da3373
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 2 deletions.
4 changes: 2 additions & 2 deletions lib/checkuninitvar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -390,7 +390,7 @@ class UninitVar : public ExecutionPath {
// Variable declaration..
if (tok.varId() && Token::Match(&tok, "%var% [[;]")) {
const Variable* var2 = symbolDatabase->getVariableFromVarId(tok.varId());
if (var2 && var2->nameToken() == &tok && !var2->isStatic() && !var2->isConst()) {
if (var2 && var2->nameToken() == &tok && !var2->isStatic() && !var2->isExtern() && !var2->isConst()) {
if (tok.linkAt(1)) { // array
const Token* endtok = tok.next();
while (endtok->link())
Expand Down Expand Up @@ -1044,7 +1044,7 @@ void CheckUninitVar::check()
void CheckUninitVar::checkScope(const Scope* scope)
{
for (std::list<Variable>::const_iterator i = scope->varlist.begin(); i != scope->varlist.end(); ++i) {
if ((i->type() && !i->isPointer()) || i->isStatic() || i->isConst() || i->isArray() || i->isReference())
if ((i->type() && !i->isPointer()) || i->isStatic() || i->isExtern() || i->isConst() || i->isArray() || i->isReference())
continue;
if (i->nameToken()->strAt(1) == "(")
continue;
Expand Down
13 changes: 13 additions & 0 deletions test/testuninitvar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,13 @@ class TestUninitVar : public TestFixture {
"}\n");
ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: a\n", errout.str());

checkUninitVar("void f()\n"
"{\n"
" extern int a;\n"
" a++;\n"
"}\n");
ASSERT_EQUALS("", errout.str());

checkUninitVar("void f()\n"
"{\n"
" int a;\n"
Expand Down Expand Up @@ -1914,6 +1921,12 @@ class TestUninitVar : public TestFixture {
"}");
ASSERT_EQUALS("", errout.str());

checkUninitVar2("int f() {\n"
" extern int x;\n"
" return ++x;\n"
"}");
ASSERT_EQUALS("", errout.str());

// using uninit var in condition
checkUninitVar2("void f() {\n"
" int x;\n"
Expand Down

0 comments on commit 9da3373

Please sign in to comment.