ExecutionPath: Refactoring if-handling
This commit is contained in:
parent
7bf0622ae0
commit
9819b75e17
|
@ -1278,7 +1278,7 @@ private:
|
||||||
return &tok;
|
return &tok;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool parseCondition(const Token &tok, std::list<ExecutionPath *> &checks) const
|
bool parseCondition(const Token &tok, std::list<ExecutionPath *> &checks)
|
||||||
{
|
{
|
||||||
if (Token::Match(&tok, "!| %var% ("))
|
if (Token::Match(&tok, "!| %var% ("))
|
||||||
{
|
{
|
||||||
|
@ -1607,7 +1607,7 @@ private:
|
||||||
return &tok;
|
return &tok;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool parseCondition(const Token &tok, std::list<ExecutionPath *> &checks) const
|
bool parseCondition(const Token &tok, std::list<ExecutionPath *> &checks)
|
||||||
{
|
{
|
||||||
bool foundError = false;
|
bool foundError = false;
|
||||||
|
|
||||||
|
|
|
@ -23,8 +23,13 @@
|
||||||
|
|
||||||
|
|
||||||
// default : bail out if the condition is has variable handling
|
// default : bail out if the condition is has variable handling
|
||||||
bool ExecutionPath::parseCondition(const Token &tok, std::list<ExecutionPath *> & /*checks*/) const
|
bool ExecutionPath::parseCondition(const Token &tok, std::list<ExecutionPath *> & checks)
|
||||||
{
|
{
|
||||||
|
if (Token::Match(tok.tokAt(-3), "!!else if ("))
|
||||||
|
{
|
||||||
|
++ifinfo;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned int parlevel = 0;
|
unsigned int parlevel = 0;
|
||||||
for (const Token *tok2 = &tok; tok2; tok2 = tok2->next())
|
for (const Token *tok2 = &tok; tok2; tok2 = tok2->next())
|
||||||
{
|
{
|
||||||
|
@ -40,7 +45,10 @@ bool ExecutionPath::parseCondition(const Token &tok, std::list<ExecutionPath *>
|
||||||
break;
|
break;
|
||||||
if (tok2->varId() != 0)
|
if (tok2->varId() != 0)
|
||||||
{
|
{
|
||||||
return true;
|
if (ifinfo > 1)
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
bailOutVar(checks, tok2->varId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,9 +60,6 @@ static const Token *checkExecutionPaths_(const Token *tok, std::list<ExecutionPa
|
||||||
{
|
{
|
||||||
const std::auto_ptr<ExecutionPath> check(checks.front()->copy());
|
const std::auto_ptr<ExecutionPath> check(checks.front()->copy());
|
||||||
|
|
||||||
// Number of "if" blocks in current scope
|
|
||||||
unsigned int numberOfIf = 0;
|
|
||||||
|
|
||||||
for (; tok; tok = tok->next())
|
for (; tok; tok = tok->next())
|
||||||
{
|
{
|
||||||
if (tok->str() == "}")
|
if (tok->str() == "}")
|
||||||
|
@ -86,10 +91,6 @@ static const Token *checkExecutionPaths_(const Token *tok, std::list<ExecutionPa
|
||||||
|
|
||||||
if (tok->str() == "if")
|
if (tok->str() == "if")
|
||||||
{
|
{
|
||||||
++numberOfIf;
|
|
||||||
if (numberOfIf > 1)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
std::list<ExecutionPath *> newchecks;
|
std::list<ExecutionPath *> newchecks;
|
||||||
while (tok->str() == "if")
|
while (tok->str() == "if")
|
||||||
{
|
{
|
||||||
|
@ -99,7 +100,12 @@ static const Token *checkExecutionPaths_(const Token *tok, std::list<ExecutionPa
|
||||||
// parse condition
|
// parse condition
|
||||||
if (check->parseCondition(*tok->next(), checks))
|
if (check->parseCondition(*tok->next(), checks))
|
||||||
{
|
{
|
||||||
ExecutionPath::bailOut(checks);
|
while (!checks.empty())
|
||||||
|
{
|
||||||
|
delete checks.back();
|
||||||
|
checks.pop_back();
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -41,14 +41,18 @@ protected:
|
||||||
Check * const owner;
|
Check * const owner;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ExecutionPath(Check *c, unsigned int id) : bailout_(false), varId(id), owner(c)
|
ExecutionPath(Check *c, unsigned int id) : bailout_(false), varId(id), owner(c), ifinfo(0)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
virtual ~ExecutionPath()
|
virtual ~ExecutionPath()
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
/** Implement this in each derived class. This function must create a copy of the current instance */
|
||||||
virtual ExecutionPath *copy() = 0;
|
virtual ExecutionPath *copy() = 0;
|
||||||
|
|
||||||
|
/** Some kind of if-information */
|
||||||
|
unsigned int ifinfo;
|
||||||
|
|
||||||
bool bailOut() const
|
bool bailOut() const
|
||||||
{
|
{
|
||||||
return bailout_;
|
return bailout_;
|
||||||
|
@ -92,7 +96,7 @@ public:
|
||||||
* @param checks The execution paths. All execution paths in the list are executed in the current scope
|
* @param checks The execution paths. All execution paths in the list are executed in the current scope
|
||||||
* @return true => bail out all checking
|
* @return true => bail out all checking
|
||||||
**/
|
**/
|
||||||
virtual bool parseCondition(const Token &tok, std::list<ExecutionPath *> &checks) const;
|
virtual bool parseCondition(const Token &tok, std::list<ExecutionPath *> &checks);
|
||||||
|
|
||||||
/** going out of scope - all execution paths end */
|
/** going out of scope - all execution paths end */
|
||||||
virtual void end(const std::list<ExecutionPath *> & /*checks*/, const Token * /*tok*/) const
|
virtual void end(const std::list<ExecutionPath *> & /*checks*/, const Token * /*tok*/) const
|
||||||
|
|
|
@ -1005,6 +1005,15 @@ private:
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: i\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: i\n", errout.str());
|
||||||
|
|
||||||
|
checkUninitVar("static int foo(int x)\n"
|
||||||
|
"{\n"
|
||||||
|
" int i;\n"
|
||||||
|
" if (x)\n"
|
||||||
|
" i = 0;\n"
|
||||||
|
" return i;\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("[test.cpp:6]: (error) Uninitialized variable: i\n", errout.str());
|
||||||
|
|
||||||
checkUninitVar("static void foo()\n"
|
checkUninitVar("static void foo()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" int x, y;\n"
|
" int x, y;\n"
|
||||||
|
@ -1139,7 +1148,7 @@ private:
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
checkUninitVar("static void foo()\n"
|
checkUninitVar("static void foo(int x)\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" Foo *p;\n"
|
" Foo *p;\n"
|
||||||
" if (x)\n"
|
" if (x)\n"
|
||||||
|
|
Loading…
Reference in New Issue