diff options
Diffstat (limited to 'src/analysis/collections.cpp')
-rw-r--r-- | src/analysis/collections.cpp | 42 |
1 files changed, 42 insertions, 0 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()); + } + } +} + } |