diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-07-03 19:15:51 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-07-03 19:15:51 +0300 |
commit | 7556ade255ff2b24214dc8e5ad32a1733f5a35b4 (patch) | |
tree | e0418969c2e270fadef69249fa9a8dee62eeb3bf /src | |
parent | 5b3fb4afecd2800245d7629a0aa8591f6e2461ed (diff) | |
download | paranucker-7556ade255ff2b24214dc8e5ad32a1733f5a35b4.tar.gz paranucker-7556ade255ff2b24214dc8e5ad32a1733f5a35b4.tar.bz2 paranucker-7556ade255ff2b24214dc8e5ad32a1733f5a35b4.tar.xz paranucker-7556ade255ff2b24214dc8e5ad32a1733f5a35b4.zip |
Fix collections after IF_STMT or other conditions.
Still broken linked vars and using just checked pointer in expression.
Diffstat (limited to 'src')
-rw-r--r-- | src/analysis/expression.cpp | 37 | ||||
-rw-r--r-- | src/analysis/statement.cpp | 9 | ||||
-rw-r--r-- | src/logger.cpp | 2 |
3 files changed, 34 insertions, 14 deletions
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp index 443a410..3608eaa 100644 --- a/src/analysis/expression.cpp +++ b/src/analysis/expression.cpp @@ -395,8 +395,23 @@ void analyseOrCondition(Node *node, Node *node1, Node *node2, const WalkItem &wi // } intersectThenNonNullChecked(wo, wo1, wo2); intersectThenNullChecked(wo, wo1, wo2); - intersectElseNonNullChecked(wo, wo1, wo2); - intersectElseNullChecked(wo, wo1, wo2); +// intersectElseNonNullChecked(wo, wo1, wo2); +// intersectElseNullChecked(wo, wo1, wo2); + + if (!wo1.uselessExpr && !wo2.uselessExpr) + { // need combine wo1 and wo2 + intersectElseNullChecked(wo, wo1, wo2); + } + if (!wo1.uselessExpr) + { + mergeElseNullChecked(wo, wo1); + mergeElseNonNullChecked(wo, wo1); + } + if (!wo2.uselessExpr) + { + mergeElseNullChecked(wo, wo2); + mergeElseNonNullChecked(wo, wo2); + } // need intersect knownNull/knownNonNull @@ -425,17 +440,19 @@ void analyseAndCondition(Node *node, Node *node1, Node *node2, const WalkItem &w wo.stopWalking = true; // probably condition wrong - if (!wo1.uselessExpr && !wo2.uselessExpr) - { // need combine wo1 and wo2 - intersectThenNullChecked(wo, wo1, wo2); - } - if (!wo1.uselessExpr) +// if (!wo1.uselessExpr && !wo2.uselessExpr) +// { // need combine wo1 and wo2 +// intersectThenNullChecked(wo, wo1, wo2); +// } +// if (!wo1.uselessExpr) { mergeThenNonNullChecked(wo, wo1); + mergeThenNullChecked(wo, wo1); } - if (!wo2.uselessExpr) +// if (!wo2.uselessExpr) { mergeThenNonNullChecked(wo, wo2); + mergeThenNullChecked(wo, wo2); } wo.knownNullVars.insert(wo1.knownNullVars.begin(), wo1.knownNullVars.end()); @@ -445,6 +462,10 @@ void analyseAndCondition(Node *node, Node *node1, Node *node2, const WalkItem &w wo1.knownNonNullVars.end()); wo.knownNonNullVars.insert(wo2.knownNonNullVars.begin(), wo2.knownNonNullVars.end()); + + intersectElseNonNullChecked(wo, wo1, wo2); + intersectElseNullChecked(wo, wo1, wo2); + 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 121818e..71b5227 100644 --- a/src/analysis/statement.cpp +++ b/src/analysis/statement.cpp @@ -145,7 +145,7 @@ void analyseCondition(Node *node, if (wo2.isReturned) { // add variable for ignore for all parent nodes except special like IF_STMT - FOR_EACH (it, wco.checkedThenNullVars) + FOR_EACH (it, wco.checkedElseNonNullVars) { wo.removeNullVarsAll.insert(it); wo.knownNonNullVars.insert(it); @@ -153,7 +153,7 @@ void analyseCondition(Node *node, } if (wco.cleanExpr) { - FOR_EACH (it, wco.checkedThenNonNullVars) + FOR_EACH (it, wco.checkedElseNullVars) { wo.knownNullVars.insert(it); } @@ -162,7 +162,7 @@ void analyseCondition(Node *node, if (wo3.isReturned) { // add variable for ignore for all parent nodes except special like IF_STMT - FOR_EACH (it, wco.checkedElseNullVars) + FOR_EACH (it, wco.checkedThenNonNullVars) { wo.removeNullVarsAll.insert(it); wo.knownNonNullVars.insert(it); @@ -170,13 +170,12 @@ void analyseCondition(Node *node, } if (wco.cleanExpr) { - FOR_EACH (it, wco.checkedElseNonNullVars) + FOR_EACH (it, wco.checkedThenNullVars) { wo.knownNullVars.insert(it); } } } - if (wo2.isReturned && wo3.isReturned) { // add variable for ignore for all parent nodes except special like IF_STMT diff --git a/src/logger.cpp b/src/logger.cpp index 4431801..addbff7 100644 --- a/src/logger.cpp +++ b/src/logger.cpp @@ -206,7 +206,7 @@ void dumpWI(Node *const node, const std::string &name, const WalkItem &wi) { - if (name != "wco " && (node->parent || node != FUNCTION_DECL || name != "analyseNode wi in ")) +// if (name != "wco " && (node->parent || node != FUNCTION_DECL || name != "analyseNode wi in ")) return; Log::log("%s%s%s %s", node->getIndent().c_str(), |