summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-07-01 15:10:56 +0300
committerAndrei Karas <akaras@inbox.ru>2015-07-01 15:10:56 +0300
commit568b3f98e65737169a14eb18fde95ecd22e607d8 (patch)
treef5bad51b38d16e31c0bfe4094aaa5ff902ee451c /src
parentd1a21baa5abad68ac83cad2206976628cce4d570 (diff)
downloadparanucker-568b3f98e65737169a14eb18fde95ecd22e607d8.tar.gz
paranucker-568b3f98e65737169a14eb18fde95ecd22e607d8.tar.bz2
paranucker-568b3f98e65737169a14eb18fde95ecd22e607d8.tar.xz
paranucker-568b3f98e65737169a14eb18fde95ecd22e607d8.zip
Fix different issues in useless variables checks.
Diffstat (limited to 'src')
-rw-r--r--src/analysis/expression.cpp17
-rw-r--r--src/analysis/statement.cpp16
2 files changed, 22 insertions, 11 deletions
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp
index 8a9bf6d..87ee12f 100644
--- a/src/analysis/expression.cpp
+++ b/src/analysis/expression.cpp
@@ -211,6 +211,7 @@ void analyseNeExpr(NeExprNode *node, const WalkItem &wi, WalkItem &wo)
if (wi.needCheckNullVars.find(var) != wi.needCheckNullVars.end())
{
wo.checkedNonNullVars.insert(var);
+ wo.knownNonNullVars.insert(var);
wo.cleanExpr = true;
wo.uselessExpr = false;
return;
@@ -320,6 +321,7 @@ void analyseEqExpr(EqExprNode *node, const WalkItem &wi, WalkItem &wo)
if (wi.needCheckNullVars.find(var) != wi.needCheckNullVars.end())
{
wo.checkedNullVars.insert(var);
+ wo.knownNullVars.insert(var);
wo.cleanExpr = true;
wo.uselessExpr = false;
if (wi.knownNullVars.find(var) != wi.knownNullVars.end())
@@ -347,9 +349,9 @@ void analyseOrCondition(Node *node, Node *node1, Node *node2, const WalkItem &wi
removeNeedCheckNullVarsSetAll(wi2, wo1.checkedNullVars);
wi2.needCheckNullVars.insert(wo1.checkedNonNullVars.begin(),
wo1.checkedNonNullVars.end());
- wi2.knownNonNullVars.insert(wo1.checkedNonNullVars.begin(),
+ wi2.knownVars.insert(wo1.checkedNonNullVars.begin(),
wo1.checkedNonNullVars.end());
- wi2.knownNullVars.insert(wo1.checkedNullVars.begin(),
+ wi2.knownVars.insert(wo1.checkedNullVars.begin(),
wo1.checkedNullVars.end());
Log::dumpWI(node, "wi2 ", wi2);
walkTree(node2, wi2, wo2);
@@ -360,9 +362,10 @@ void analyseOrCondition(Node *node, Node *node1, Node *node2, const WalkItem &wi
// probably condition wrong
if (wo2.cleanExpr)
mergeNullChecked(wo, wo2);
- // need check for cleanExpr?
intersectNonNullChecked(wo, wo1, wo2);
+ // need intersect knownNull/knownNonNull
+
wo.cleanExpr = true;
wo.stopWalking = true;
wo.uselessExpr = false;
@@ -400,6 +403,14 @@ void analyseAndCondition(Node *node, Node *node1, Node *node2, const WalkItem &w
{
mergeNonNullChecked(wo, wo2);
}
+ wo.knownNullVars.insert(wo1.knownNullVars.begin(),
+ wo1.knownNullVars.end());
+ wo.knownNullVars.insert(wo2.knownNullVars.begin(),
+ wo2.knownNullVars.end());
+ wo.knownNonNullVars.insert(wo1.knownNonNullVars.begin(),
+ wo1.knownNonNullVars.end());
+ wo.knownNonNullVars.insert(wo2.knownNonNullVars.begin(),
+ wo2.knownNonNullVars.end());
wo.cleanExpr = wo1.cleanExpr && wo2.cleanExpr;
wo.uselessExpr = wo1.uselessExpr && wo2.uselessExpr;
}
diff --git a/src/analysis/statement.cpp b/src/analysis/statement.cpp
index a806912..263d622 100644
--- a/src/analysis/statement.cpp
+++ b/src/analysis/statement.cpp
@@ -63,10 +63,10 @@ void analyseCondition(Node *node,
removeNeedCheckNullVarsSetAll(wi2, wco.checkedNonNullVars);
wi2.needCheckNullVars.insert(wco.checkedNullVars.begin(),
wco.checkedNullVars.end());
- wi2.knownNonNullVars.insert(wco.checkedNonNullVars.begin(),
- wco.checkedNonNullVars.end());
- wi2.knownNullVars.insert(wco.checkedNullVars.begin(),
- wco.checkedNullVars.end());
+ wi2.knownNonNullVars.insert(wco.knownNonNullVars.begin(),
+ wco.knownNonNullVars.end());
+ wi2.knownNullVars.insert(wco.knownNullVars.begin(),
+ wco.knownNullVars.end());
Log::dumpWI(node, "wi2 then ", wi2);
reportParmDeclNullPointer(node,
@@ -79,10 +79,10 @@ void analyseCondition(Node *node,
removeNeedCheckNullVarsSetAll(wi3, wco.checkedNullVars);
wi3.needCheckNullVars.insert(wco.checkedNonNullVars.begin(),
wco.checkedNonNullVars.end());
- wi3.knownNullVars.insert(wco.checkedNonNullVars.begin(),
- wco.checkedNonNullVars.end());
- wi3.knownNonNullVars.insert(wco.checkedNullVars.begin(),
- wco.checkedNullVars.end());
+ wi3.knownNullVars.insert(wco.knownNonNullVars.begin(),
+ wco.knownNonNullVars.end());
+ wi3.knownNonNullVars.insert(wco.knownNullVars.begin(),
+ wco.knownNullVars.end());
Log::dumpWI(node, "wi3 else ", wi3);
reportParmDeclNullPointer(node,