summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/analysis/analysis.cpp12
-rw-r--r--src/analysis/analysis.h6
-rw-r--r--src/analysis/expression.cpp10
3 files changed, 26 insertions, 2 deletions
diff --git a/src/analysis/analysis.cpp b/src/analysis/analysis.cpp
index c90d474..8352971 100644
--- a/src/analysis/analysis.cpp
+++ b/src/analysis/analysis.cpp
@@ -64,6 +64,18 @@ void removeCheckNullVars(WalkItem &wi)
}
}
+void removeCheckNullVarsSet(WalkItem &wi, std::set<std::string> &vars)
+{
+ FOR_EACH (std::set<std::string>::const_iterator, it, vars)
+ {
+ // found var for deletion
+ if (wi.checkNullVars.find(*it) != wi.checkNullVars.end())
+ {
+ wi.checkNullVars.erase(*it);
+ }
+ }
+}
+
void startWalkTree(Node *node)
{
WalkItem wi;
diff --git a/src/analysis/analysis.h b/src/analysis/analysis.h
index f404352..4d921cb 100644
--- a/src/analysis/analysis.h
+++ b/src/analysis/analysis.h
@@ -22,6 +22,9 @@
#include "includes.h"
+#include <set>
+#include <string>
+
struct Node;
struct WalkItem;
@@ -41,6 +44,9 @@ namespace Analysis
void removeCheckNullVars(WalkItem &wi);
+ void removeCheckNullVarsSet(WalkItem &wi,
+ std::set<std::string> &vars);
+
Node *skipNop(Node *node);
void mergeNullChecked(WalkItem &wi1, WalkItem &wi2);
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp
index 66e32ce..e205e7b 100644
--- a/src/analysis/expression.cpp
+++ b/src/analysis/expression.cpp
@@ -154,8 +154,11 @@ void analyseTruthOrIfExpr(TruthOrIfExprNode *node, const WalkItem &wi, WalkItem
WalkItem wo1 = wo;
WalkItem wo2 = wo;
walkTree(node->args[0], wi, wo1);
- walkTree(node->args[1], wi, wo2);
Log::dumpWI(node, "wo1 ", wo1);
+ WalkItem wi2 = wi;
+ removeCheckNullVarsSet(wi2, wo1.checkedNullVars);
+ Log::dumpWI(node, "wi2 ", wi2);
+ walkTree(node->args[1], wi2, wo2);
Log::dumpWI(node, "wo2 ", wo2);
// probably condition wrong
if (wo1.cleanExpr)
@@ -182,8 +185,11 @@ void analyseTruthAndIfExpr(TruthAndIfExprNode *node, const WalkItem &wi, WalkIte
WalkItem wo1 = wo;
WalkItem wo2 = wo;
walkTree(node->args[0], wi, wo1);
- walkTree(node->args[1], wi, wo2);
Log::dumpWI(node, "wo1 ", wo1);
+ WalkItem wi2 = wi;
+ removeCheckNullVarsSet(wi2, wo1.checkedNonNullVars);
+ Log::dumpWI(node, "wi2 ", wi2);
+ walkTree(node->args[1], wi2, wo2);
Log::dumpWI(node, "wo2 ", wo2);
wo.stopWalking = true;