summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/analysis/collections.cpp16
-rw-r--r--src/analysis/collections.h4
-rw-r--r--src/analysis/statement.cpp6
3 files changed, 21 insertions, 5 deletions
diff --git a/src/analysis/collections.cpp b/src/analysis/collections.cpp
index e9acce6..12fcd7a 100644
--- a/src/analysis/collections.cpp
+++ b/src/analysis/collections.cpp
@@ -69,7 +69,7 @@ void removeKnownNullVars2(WalkItem &wi, WalkItem &wo)
}
}
-void removeNeedCheckNullVars2(WalkItem &wco, WalkItem &wi, WalkItem &wo)
+void removeNeedCheckNullVarsThen(WalkItem &wco, WalkItem &wi, WalkItem &wo)
{
FOR_EACH (it, wi.knownNonNullVars)
{
@@ -83,6 +83,20 @@ void removeNeedCheckNullVars2(WalkItem &wco, WalkItem &wi, WalkItem &wo)
}
}
+void removeNeedCheckNullVarsElse(WalkItem &wco, WalkItem &wi, WalkItem &wo)
+{
+ FOR_EACH (it, wi.knownNonNullVars)
+ {
+ // check what it presend in if condition like if (!it) and in else like if (it)
+ if (isIn(it, wco.checkedElseNullVars) &&
+ isIn(it, wco.checkedThenNonNullVars))
+ {
+ removeNeedCheckNullVarOnly(wo, it);
+ addNonNullVar(wo, it);
+ }
+ }
+}
+
// remove one variable from null pointer checks
void removeNeedCheckNullVar(WalkItem &wi, std::string str)
{
diff --git a/src/analysis/collections.h b/src/analysis/collections.h
index e81cc7e..4f6810f 100644
--- a/src/analysis/collections.h
+++ b/src/analysis/collections.h
@@ -90,7 +90,9 @@ namespace Analysis
void removeLinkVarOnly(WalkItem &wi, const std::string &var);
- void removeNeedCheckNullVars2(WalkItem &wco, WalkItem &wi, WalkItem &wo);
+ void removeNeedCheckNullVarsThen(WalkItem &wco, WalkItem &wi, WalkItem &wo);
+
+ void removeNeedCheckNullVarsElse(WalkItem &wco, WalkItem &wi, WalkItem &wo);
void addKnownNonNullVarWithLinked(WalkItem &wo, WalkItem &wi, const std::string &var);
diff --git a/src/analysis/statement.cpp b/src/analysis/statement.cpp
index 573b5ec..0f9f2eb 100644
--- a/src/analysis/statement.cpp
+++ b/src/analysis/statement.cpp
@@ -126,7 +126,7 @@ void analyseCondition(Node *node,
else if (thenNode)
{
addNeedCheckNullVars2(wo2, wo);
- removeNeedCheckNullVars2(wco, wo2, wo);
+ removeNeedCheckNullVarsThen(wco, wo2, wo);
removeKnownNullVars2(wo2, wo);
}
if (wo3.isReturned || wo3.isContinued)
@@ -146,7 +146,7 @@ void analyseCondition(Node *node,
else if (elseNode)
{
addNeedCheckNullVars2(wo3, wo);
- removeNeedCheckNullVars2(wco, wo2, wo);
+ removeNeedCheckNullVarsElse(wco, wo3, wo);
removeKnownNullVars2(wo3, wo);
}
if ((wo2.isReturned || wo2.isContinued) && (wo3.isReturned || wo3.isContinued))
@@ -249,7 +249,7 @@ void analyseWhileStmt(WhileStmtNode *node, const WalkItem &wi, WalkItem &wo)
command = oldCommand;
Log::dumpWI(node, "wco2 ", wco);
- removeNeedCheckNullVars2(wcoSaved, wo2Saved, wo);
+ removeNeedCheckNullVarsThen(wcoSaved, wo2Saved, wo);
removeKnownNullVars2(wo2Saved, wo);
}