Reviewed handling of << and >> in C files in CheckUninitVar

This commit is contained in:
Daniel Marjamäki 2012-06-23 12:41:00 +02:00
parent e2964c0c9e
commit f0f69ed818
2 changed files with 18 additions and 3 deletions

View File

@ -558,7 +558,7 @@ private:
return tok.tokAt(3); return tok.tokAt(3);
} }
else if (Token::Match(tok.previous(), "<<|>>") || Token::simpleMatch(tok.next(), "=")) { else if ((!isC && Token::Match(tok.previous(), "<<|>>")) || Token::simpleMatch(tok.next(), "=")) {
// TODO: Don't bail out for "<<" and ">>" if these are // TODO: Don't bail out for "<<" and ">>" if these are
// just computations // just computations
ExecutionPath::bailOutVar(checks, tok.varId()); ExecutionPath::bailOutVar(checks, tok.varId());

View File

@ -348,14 +348,21 @@ private:
"}\n"); "}\n");
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
checkUninitVar("int a()\n" checkUninitVar("int a() {\n"
"{\n"
" int ret;\n" " int ret;\n"
" std::cin >> ret;\n" " std::cin >> ret;\n"
" return ret;\n" " return ret;\n"
"}\n"); "}\n");
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
checkUninitVar("int a() {\n"
" int ret;\n"
" int a = value >> ret;\n"
" return ret;\n"
"}\n",
"test.c");
ASSERT_EQUALS("[test.c:3]: (error) Uninitialized variable: ret\n", errout.str());
checkUninitVar("void foo() {\n" // #3707 checkUninitVar("void foo() {\n" // #3707
" Node node;\n" " Node node;\n"
" int x;\n" " int x;\n"
@ -370,6 +377,14 @@ private:
"}\n"); "}\n");
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
checkUninitVar("int a() {\n"
" int ret;\n"
" int a = value << ret;\n"
" return ret;\n"
"}\n",
"test.c");
ASSERT_EQUALS("[test.c:3]: (error) Uninitialized variable: ret\n", errout.str());
checkUninitVar("int a()\n" checkUninitVar("int a()\n"
"{\n" "{\n"
" int ret;\n" " int ret;\n"