summaryrefslogtreecommitdiff
path: root/src/analysis
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-07-10 01:09:26 +0300
committerAndrei Karas <akaras@inbox.ru>2015-07-10 01:09:26 +0300
commit448b1a6a299033709e2fb585ac4b7f7c29cde919 (patch)
tree1ea71651b3e7318d1d471925754f4d51359501f1 /src/analysis
parentf21d3beacdcdf9f86dbc06a9aa356ff07d6e4b39 (diff)
downloadparanucker-448b1a6a299033709e2fb585ac4b7f7c29cde919.tar.gz
paranucker-448b1a6a299033709e2fb585ac4b7f7c29cde919.tar.bz2
paranucker-448b1a6a299033709e2fb585ac4b7f7c29cde919.tar.xz
paranucker-448b1a6a299033709e2fb585ac4b7f7c29cde919.zip
Add ability to check variables assigned in if/while and check outside of this block.
Diffstat (limited to 'src/analysis')
-rw-r--r--src/analysis/collections.cpp27
-rw-r--r--src/analysis/expression.cpp3
-rw-r--r--src/analysis/statement.cpp12
3 files changed, 20 insertions, 22 deletions
diff --git a/src/analysis/collections.cpp b/src/analysis/collections.cpp
index 0f3a8f8..92dd51f 100644
--- a/src/analysis/collections.cpp
+++ b/src/analysis/collections.cpp
@@ -35,13 +35,6 @@ void addNeedCheckNullVars(WalkItem &wi, WalkItem &wo)
{
wo.needCheckNullVars.insert(it);
wo.knownVars.insert(it);
-/*
- wo.knownNonNullVars.erase(it);
- wo.knownNullVars.erase(it);
- wo.removeNullVars.erase(it);
- wo.removeNullVarsAll.erase(it);
- wo.addNullVars.insert(it);
-*/
}
}
@@ -50,13 +43,16 @@ void addNeedCheckNullVars2(WalkItem &wi, WalkItem &wo)
{
FOR_EACH (it, wi.addNullVars)
{
- wo.needCheckNullVars.insert(it);
- wo.knownVars.insert(it);
- wo.knownNonNullVars.erase(it);
- wo.knownNullVars.erase(it);
- wo.removeNullVars.erase(it);
- wo.removeNullVarsAll.erase(it);
- wo.addNullVars.insert(it);
+ if (isNotIn(it, wo.addNullVars))
+ {
+ wo.needCheckNullVars.insert(it);
+ wo.knownVars.insert(it);
+ wo.knownNonNullVars.erase(it);
+ wo.knownNullVars.erase(it);
+ wo.removeNullVars.erase(it);
+ wo.removeNullVarsAll.erase(it);
+ wo.addNullVars.insert(it);
+ }
}
}
@@ -167,6 +163,7 @@ void addUnknownVar(WalkItem &wi,
wi.knownNonNullVars.erase(var);
wi.addNullVars.insert(var);
wi.removeNullVars.erase(var);
+ wi.removeNullVarsAll.erase(var);
}
void addNonNullVar(WalkItem &wi,
@@ -184,7 +181,7 @@ void addLinkedVar(WalkItem &wi,
std::string parent,
const std::string &var)
{
- //Log::log("add var: %s, %s\n", parent.c_str(), var.c_str());
+ //Log::log("addLinkedVar: %s, %s\n", parent.c_str(), var.c_str());
if (isIn(parent, wi.addNullVars) ||
isIn(parent, wi.needCheckNullVars))
{
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp
index b6e00ca..683623a 100644
--- a/src/analysis/expression.cpp
+++ b/src/analysis/expression.cpp
@@ -165,12 +165,13 @@ void analyseModifyExpr(ModifyExprNode *node, const WalkItem &wi, WalkItem &wo)
else if (!var1.empty())
{
if (var2.empty())
- { // have var1 only (var1 = UNKNOWN)
+ { // have var1 only (var1 = UNKNOWN or var1 = function(...))
bool handled(false);
if (node->args[1] == CALL_EXPR && isPointerArg(arg))
{
handled = handleSetVarToFunction(var1, node->args[1], wo);
}
+ // have var1 only (var1 = UNKNOWN)
if (!handled)
removeVar(wo, var1);
}
diff --git a/src/analysis/statement.cpp b/src/analysis/statement.cpp
index dd370fa..1d64ac3 100644
--- a/src/analysis/statement.cpp
+++ b/src/analysis/statement.cpp
@@ -122,9 +122,9 @@ void analyseCondition(Node *node,
addKnownNullVarsWithLinked(wo, wco, wco.checkedElseNullVars);
}
}
- else
+ else if (thenNode)
{
-// addNeedCheckNullVars2(wo2, wo);
+ addNeedCheckNullVars2(wo2, wo);
}
if (wo3.isReturned)
{
@@ -140,9 +140,9 @@ void analyseCondition(Node *node,
addKnownNullVarsWithLinked(wo, wco, wco.checkedThenNullVars);
}
}
- else
+ else if (elseNode)
{
-// addNeedCheckNullVars2(wo3, wo);
+ addNeedCheckNullVars2(wo3, wo);
}
if (wo2.isReturned && wo3.isReturned)
{
@@ -229,9 +229,9 @@ void analyseWhileStmt(WhileStmtNode *node, const WalkItem &wi, WalkItem &wo)
addKnownNullVarsWithLinked(wo, wco, wco.checkedElseNullVars);
}
}
- else
+ else if (bodyNode)
{
-// addNeedCheckNullVars2(wo2, wo);
+ addNeedCheckNullVars2(wo2, wo);
}
wo.isReturned = false;