diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/analysis/collections.cpp | 42 | ||||
-rw-r--r-- | src/analysis/collections.h | 8 | ||||
-rw-r--r-- | src/analysis/statement.cpp | 81 |
3 files changed, 80 insertions, 51 deletions
diff --git a/src/analysis/collections.cpp b/src/analysis/collections.cpp index 81559f9..21c8ec1 100644 --- a/src/analysis/collections.cpp +++ b/src/analysis/collections.cpp @@ -19,6 +19,8 @@ #include "analysis/analysis.h" +#include "logger.h" + #include "analysis/walkitem.h" #include "localconsts.h" @@ -234,4 +236,44 @@ void removeFromNeedCheckNullVars(WalkItem &wi, std::set<std::string> &vars) } } +void addKnownNullVarsWithLinked(WalkItem &wo, WalkItem &wi, std::set<std::string> &vars) +{ + wo.knownNullVars.insert(vars.begin(), + vars.end()); + FOR_EACH (it, vars) + { + auto it2 = wi.linkedVars.find(it); + if (it2 == wi.linkedVars.end() && isIn(it, wi.linkedReverseVars)) + { + wo.knownNullVars.insert(wi.linkedReverseVars[it]); + it2 = wi.linkedVars.find(wi.linkedReverseVars[it]); + } + if (it2 != wi.linkedVars.end()) + { + const StringSet &linked = (*it2).second; + wo.knownNullVars.insert(linked.begin(), linked.end()); + } + } +} + +void addKnownNonNullVarsWithLinked(WalkItem &wo, WalkItem &wi, std::set<std::string> &vars) +{ + wo.knownNonNullVars.insert(vars.begin(), + vars.end()); + FOR_EACH (it, vars) + { + auto it2 = wi.linkedVars.find(it); + if (it2 == wi.linkedVars.end() && isIn(it, wi.linkedReverseVars)) + { + wo.knownNonNullVars.insert(wi.linkedReverseVars[it]); + it2 = wi.linkedVars.find(wi.linkedReverseVars[it]); + } + if (it2 != wi.linkedVars.end()) + { + const StringSet &linked = (*it2).second; + wo.knownNonNullVars.insert(linked.begin(), linked.end()); + } + } +} + } diff --git a/src/analysis/collections.h b/src/analysis/collections.h index 6e31f87..2911d33 100644 --- a/src/analysis/collections.h +++ b/src/analysis/collections.h @@ -66,6 +66,14 @@ namespace Analysis void removeFromNeedCheckNullVars(WalkItem &wi, std::set<std::string> &vars); + + void addKnownNullVarsWithLinked(WalkItem &wo, + WalkItem &wi, + std::set<std::string> &vars); + + void addKnownNonNullVarsWithLinked(WalkItem &wo, + WalkItem &wi, + std::set<std::string> &vars); } #endif // ANALYSIS_COLLECTIONS_H diff --git a/src/analysis/statement.cpp b/src/analysis/statement.cpp index ec9ec7f..790e4ba 100644 --- a/src/analysis/statement.cpp +++ b/src/analysis/statement.cpp @@ -66,16 +66,15 @@ void analyseCondition(Node *node, removeNeedCheckNullVarsSetAll(wi2, wco.checkedThenNonNullVars); wi2.needCheckNullVars.insert(wco.checkedThenNullVars.begin(), wco.checkedThenNullVars.end()); -// wi2.knownNonNullVars.insert(wco.knownNonNullVars.begin(), -// wco.knownNonNullVars.end()); -// wi2.knownNullVars.insert(wco.knownNullVars.begin(), -// wco.knownNullVars.end()); - wi2.knownNullVars.insert(wco.checkedThenNullVars.begin(), - wco.checkedThenNullVars.end()); - wi2.knownNonNullVars.insert(wco.checkedThenNonNullVars.begin(), - wco.checkedThenNonNullVars.end()); + addKnownNullVarsWithLinked(wi2, wco, wco.checkedThenNullVars); + addKnownNonNullVarsWithLinked(wi2, wco, wco.checkedThenNonNullVars); +// wi2.knownNullVars.insert(wco.checkedThenNullVars.begin(), +// wco.checkedThenNullVars.end()); +// wi2.knownNonNullVars.insert(wco.checkedThenNonNullVars.begin(), +// wco.checkedThenNonNullVars.end()); wi2.needCheckNullVars = wi2.knownVars; - removeFromNeedCheckNullVars(wi2, wi2.knownNonNullVars); + removeNeedCheckNullVarsSetAll(wi2, wi2.knownNonNullVars); +// removeFromNeedCheckNullVars(wi2, wi2.knownNonNullVars); wo2 = wi2; Log::dumpWI(node, "wi2 then ", wi2); @@ -90,39 +89,15 @@ void analyseCondition(Node *node, 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.knownNullVars.insert(wco.checkedElseNullVars.begin(), - wco.checkedElseNullVars.end()); - wi3.knownNonNullVars.insert(wco.checkedElseNonNullVars.begin(), - wco.checkedElseNonNullVars.end()); + addKnownNullVarsWithLinked(wi3, wco, wco.checkedElseNullVars); + addKnownNonNullVarsWithLinked(wi3, wco, wco.checkedElseNonNullVars); +// 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); - // ? - mergeThenNonNullChecked(wi3, wo2); - if (wo2.isReturned) - { - // add variable for ignore for all parent nodes except special like IF_STMT - FOR_EACH (it, wco.checkedThenNullVars) - { - wi3.removeNullVarsAll.insert(it); - wi3.knownNonNullVars.insert(it); - removeNeedCheckNullVar(wi3, it); - } - if (wco.cleanExpr) - { - FOR_EACH (it, wco.checkedThenNonNullVars) - { - wi3.knownNullVars.insert(it); - } - } - } -*/ + removeNeedCheckNullVarsSetAll(wi3, wi3.knownNonNullVars); +// removeFromNeedCheckNullVars(wi3, wi3.knownNonNullVars); wo3 = wi3; Log::dumpWI(node, "wi3 else ", wi3); @@ -148,15 +123,17 @@ void analyseCondition(Node *node, FOR_EACH (it, wco.checkedElseNonNullVars) { wo.removeNullVarsAll.insert(it); - wo.knownNonNullVars.insert(it); + //wo.knownNonNullVars.insert(it); removeNeedCheckNullVar(wo, it); } + addKnownNonNullVarsWithLinked(wo, wco, wco.checkedElseNonNullVars); if (wco.cleanExpr) { - FOR_EACH (it, wco.checkedElseNullVars) - { - wo.knownNullVars.insert(it); - } + addKnownNullVarsWithLinked(wo, wco, wco.checkedElseNullVars); +// FOR_EACH (it, wco.checkedElseNullVars) +// { +// wo.knownNullVars.insert(it); +// } } } if (wo3.isReturned) @@ -165,15 +142,17 @@ void analyseCondition(Node *node, FOR_EACH (it, wco.checkedThenNonNullVars) { wo.removeNullVarsAll.insert(it); - wo.knownNonNullVars.insert(it); + //wo.knownNonNullVars.insert(it); removeNeedCheckNullVar(wo, it); } + addKnownNonNullVarsWithLinked(wo, wco, wco.checkedThenNonNullVars); if (wco.cleanExpr) { - FOR_EACH (it, wco.checkedThenNullVars) - { - wo.knownNullVars.insert(it); - } + addKnownNullVarsWithLinked(wo, wco, wco.checkedThenNullVars); +// FOR_EACH (it, wco.checkedThenNullVars) +// { +// wo.knownNullVars.insert(it); +// } } } if (wo2.isReturned && wo3.isReturned) |