diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-07-01 15:10:56 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-07-01 15:10:56 +0300 |
commit | 568b3f98e65737169a14eb18fde95ecd22e607d8 (patch) | |
tree | f5bad51b38d16e31c0bfe4094aaa5ff902ee451c /src | |
parent | d1a21baa5abad68ac83cad2206976628cce4d570 (diff) | |
download | paranucker-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.cpp | 17 | ||||
-rw-r--r-- | src/analysis/statement.cpp | 16 |
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, |