diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-07-03 17:21:47 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-07-03 17:21:47 +0300 |
commit | 72f4460325aada58e9fae35c626832c31b1ed087 (patch) | |
tree | 11aed83993922646951f849f21e743517ae98889 /src | |
parent | c34af863bf4f6ad74257302c2effb535dd115289 (diff) | |
download | paranucker-72f4460325aada58e9fae35c626832c31b1ed087.tar.gz paranucker-72f4460325aada58e9fae35c626832c31b1ed087.tar.bz2 paranucker-72f4460325aada58e9fae35c626832c31b1ed087.tar.xz paranucker-72f4460325aada58e9fae35c626832c31b1ed087.zip |
Add incomplete implimentation for checkedElse* sets.
Diffstat (limited to 'src')
-rw-r--r-- | src/analysis/checks.cpp | 2 | ||||
-rw-r--r-- | src/analysis/collections.cpp | 34 | ||||
-rw-r--r-- | src/analysis/collections.h | 8 | ||||
-rw-r--r-- | src/analysis/expression.cpp | 4 | ||||
-rw-r--r-- | src/analysis/statement.cpp | 29 | ||||
-rw-r--r-- | src/analysis/walkitem.h | 10 | ||||
-rw-r--r-- | src/logger.cpp | 2 |
7 files changed, 75 insertions, 14 deletions
diff --git a/src/analysis/checks.cpp b/src/analysis/checks.cpp index 7500602..773b9b3 100644 --- a/src/analysis/checks.cpp +++ b/src/analysis/checks.cpp @@ -124,6 +124,8 @@ std::set<std::string> getCollection(Node *node, else convertCollection(addNullVars) else convertCollection(checkedThenNullVars) else convertCollection(checkedThenNonNullVars) + else convertCollection(checkedElseNullVars) + else convertCollection(checkedElseNonNullVars) else { reportWrongCheck(node); diff --git a/src/analysis/collections.cpp b/src/analysis/collections.cpp index 9dc4429..81559f9 100644 --- a/src/analysis/collections.cpp +++ b/src/analysis/collections.cpp @@ -165,6 +165,13 @@ void mergeThenNullChecked(WalkItem &wi1, WalkItem &wi2) wi2.checkedThenNullVars.end()); } +// merger two checked for null var sets +void mergeElseNullChecked(WalkItem &wi1, WalkItem &wi2) +{ + wi1.checkedElseNullVars.insert(wi2.checkedElseNullVars.begin(), + wi2.checkedElseNullVars.end()); +} + // merger two checked for non null var sets void mergeThenNonNullChecked(WalkItem &wi1, WalkItem &wi2) { @@ -172,6 +179,13 @@ void mergeThenNonNullChecked(WalkItem &wi1, WalkItem &wi2) wi2.checkedThenNonNullVars.end()); } +// merger two checked for non null var sets +void mergeElseNonNullChecked(WalkItem &wi1, WalkItem &wi2) +{ + wi1.checkedElseNonNullVars.insert(wi2.checkedElseNonNullVars.begin(), + wi2.checkedElseNonNullVars.end()); +} + // intersect two checked for null sets void intersectThenNullChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2) { @@ -182,6 +196,16 @@ void intersectThenNullChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2) } } +// intersect two checked for null sets +void intersectElseNullChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2) +{ + FOR_EACH (it, wi1.checkedElseNullVars) + { + if (isIn(it, wi2.checkedElseNullVars)) + wi.checkedElseNullVars.insert(it); + } +} + // intersect two checked for non null sets void intersectThenNonNullChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2) { @@ -192,6 +216,16 @@ void intersectThenNonNullChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2) } } +// intersect two checked for non null sets +void intersectElseNonNullChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2) +{ + FOR_EACH (it, wi1.checkedElseNonNullVars) + { + if (isIn(it, wi2.checkedElseNonNullVars)) + wi.checkedElseNonNullVars.insert(it); + } +} + void removeFromNeedCheckNullVars(WalkItem &wi, std::set<std::string> &vars) { FOR_EACH (it, vars) diff --git a/src/analysis/collections.h b/src/analysis/collections.h index 70d8d03..6e31f87 100644 --- a/src/analysis/collections.h +++ b/src/analysis/collections.h @@ -50,12 +50,20 @@ namespace Analysis void mergeThenNullChecked(WalkItem &wi1, WalkItem &wi2); + void mergeElseNullChecked(WalkItem &wi1, WalkItem &wi2); + void mergeThenNonNullChecked(WalkItem &wi1, WalkItem &wi2); + void mergeElseNonNullChecked(WalkItem &wi1, WalkItem &wi2); + void intersectThenNullChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2); + void intersectElseNullChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2); + void intersectThenNonNullChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2); + void intersectElseNonNullChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2); + void removeFromNeedCheckNullVars(WalkItem &wi, std::set<std::string> &vars); } diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp index 5895d98..443a410 100644 --- a/src/analysis/expression.cpp +++ b/src/analysis/expression.cpp @@ -229,6 +229,7 @@ void analyseNeExpr(NeExprNode *node, const WalkItem &wi, WalkItem &wo) if (isIn(var, wi.needCheckNullVars)) { wo.checkedThenNonNullVars.insert(var); + wo.checkedElseNullVars.insert(var); wo.knownNonNullVars.insert(var); wo.cleanExpr = true; wo.uselessExpr = false; @@ -340,6 +341,7 @@ void analyseEqExpr(EqExprNode *node, const WalkItem &wi, WalkItem &wo) if (isIn(var, wi.needCheckNullVars)) { wo.checkedThenNullVars.insert(var); + wo.checkedElseNonNullVars.insert(var); wo.knownNullVars.insert(var); wo.cleanExpr = true; wo.uselessExpr = false; @@ -393,6 +395,8 @@ 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); // need intersect knownNull/knownNonNull diff --git a/src/analysis/statement.cpp b/src/analysis/statement.cpp index 3a89d65..121818e 100644 --- a/src/analysis/statement.cpp +++ b/src/analysis/statement.cpp @@ -86,16 +86,21 @@ void analyseCondition(Node *node, Log::dumpWI(node, "wo2 then ", wo2); WalkItem wi3 = wi; -// if (wco.cleanExpr) -// removeNeedCheckNullVarsSetAll(wi3, wco.checkedThenNullVars); -// wi3.needCheckNullVars.insert(wco.checkedThenNonNullVars.begin(), -// wco.checkedThenNonNullVars.end()); + if (wco.cleanExpr) + removeNeedCheckNullVarsSetAll(wi3, wco.checkedElseNullVars); + wi3.needCheckNullVars.insert(wco.checkedElseNonNullVars.begin(), + wco.checkedElseNonNullVars.end()); // wi3.knownNonNullVars.insert(wco.knownNullVars.begin(), // wco.knownNullVars.end()); // wi3.knownNullVars.insert(wco.knownNonNullVars.begin(), // wco.knownNonNullVars.end()); -// wi3.needCheckNullVars = wi3.knownVars; -// removeFromNeedCheckNullVars(wi3, wi3.knownNonNullVars); + wi3.knownNullVars.insert(wco.checkedElseNullVars.begin(), + wco.checkedElseNullVars.end()); + wi3.knownNonNullVars.insert(wco.checkedElseNonNullVars.begin(), + wco.checkedElseNonNullVars.end()); + wi3.needCheckNullVars = wi3.knownVars; + removeFromNeedCheckNullVars(wi3, wi3.knownNonNullVars); +/* if (wo2.cleanExpr) mergeThenNullChecked(wi3, wo2); // ? @@ -117,7 +122,7 @@ void analyseCondition(Node *node, } } } - +*/ wo3 = wi3; Log::dumpWI(node, "wi3 else ", wi3); @@ -130,12 +135,12 @@ void analyseCondition(Node *node, // probably condition wrong if (wo2.cleanExpr) - mergeThenNullChecked(wo, wo2); + mergeElseNullChecked(wo, wo2); // probably condition wrong if (wo3.cleanExpr) - mergeThenNullChecked(wo, wo3); + mergeElseNullChecked(wo, wo3); // need check for cleanExpr? - intersectThenNonNullChecked(wo, wo2, wo3); + intersectElseNonNullChecked(wo, wo2, wo3); if (wo2.isReturned) { @@ -157,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.checkedThenNonNullVars) + FOR_EACH (it, wco.checkedElseNullVars) { wo.removeNullVarsAll.insert(it); wo.knownNonNullVars.insert(it); @@ -165,7 +170,7 @@ void analyseCondition(Node *node, } if (wco.cleanExpr) { - FOR_EACH (it, wco.checkedThenNullVars) + FOR_EACH (it, wco.checkedElseNonNullVars) { wo.knownNullVars.insert(it); } diff --git a/src/analysis/walkitem.h b/src/analysis/walkitem.h index 60bd30d..829a73e 100644 --- a/src/analysis/walkitem.h +++ b/src/analysis/walkitem.h @@ -40,6 +40,8 @@ struct WalkItem addNullVars(), checkedThenNullVars(), checkedThenNonNullVars(), + checkedElseNullVars(), + checkedElseNonNullVars(), linkedVars(), linkedReverseVars(), stopWalking(false), @@ -59,6 +61,8 @@ struct WalkItem addNullVars(item.addNullVars), checkedThenNullVars(item.checkedThenNullVars), checkedThenNonNullVars(item.checkedThenNonNullVars), + checkedElseNullVars(item.checkedElseNullVars), + checkedElseNonNullVars(item.checkedElseNonNullVars), linkedVars(item.linkedVars), linkedReverseVars(item.linkedReverseVars), stopWalking(item.stopWalking), @@ -75,8 +79,10 @@ struct WalkItem StringSet removeNullVarsAll; // need remove vars from parent checkNullVars with linked vars StringSet removeNullVars; // need remove vars from parent checkNullVars without linked vars StringSet addNullVars; // need add vars to parent checkNullVars - StringSet checkedThenNullVars; // vars checked for null in expressions - StringSet checkedThenNonNullVars; // vars checked for nonnull in expressions + StringSet checkedThenNullVars; // vars checked for null in expressions for then case + StringSet checkedThenNonNullVars; // vars checked for nonnull in expressions for then case + StringSet checkedElseNullVars; // vars checked for null in expressions for else case + StringSet checkedElseNonNullVars; // vars checked for nonnull in expressions for else case StringMapSet linkedVars; // linked vars. map <parent, set(vars)> StringMap linkedReverseVars; // linked vars. map <child, parent> bool stopWalking; // stop walking on tree after this node diff --git a/src/logger.cpp b/src/logger.cpp index 93e4140..4431801 100644 --- a/src/logger.cpp +++ b/src/logger.cpp @@ -221,6 +221,8 @@ void dumpWI(Node *const node, Log::log(" returned"); dumpWIProps(" checkedThenNullVars:", wi.checkedThenNullVars) dumpWIProps(" checkedThenNonNullVars:", wi.checkedThenNonNullVars) + dumpWIProps(" checkedElseNullVars:", wi.checkedElseNullVars) + dumpWIProps(" checkedElseNonNullVars:", wi.checkedElseNonNullVars) dumpWIProps(" needCheckNullVars:", wi.needCheckNullVars) dumpWIProps(" knownVars:", wi.knownVars) dumpWIProps(" knownNullVars:", wi.knownNullVars) |