diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-07-10 16:33:44 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-07-10 16:33:44 +0300 |
commit | 8d71522916ba1e1058f362ecd69316b1a2a702cc (patch) | |
tree | 00c956d9d178c1821fba41362be66e83fa874ef6 /src | |
parent | 2fbe80e73b358c5017e3dff849732c7922c6ddd5 (diff) | |
download | paranucker-8d71522916ba1e1058f362ecd69316b1a2a702cc.tar.gz paranucker-8d71522916ba1e1058f362ecd69316b1a2a702cc.tar.bz2 paranucker-8d71522916ba1e1058f362ecd69316b1a2a702cc.tar.xz paranucker-8d71522916ba1e1058f362ecd69316b1a2a702cc.zip |
Unlink assigned variable in if/while body.
Diffstat (limited to 'src')
-rw-r--r-- | src/analysis/collections.cpp | 27 | ||||
-rw-r--r-- | src/analysis/collections.h | 2 |
2 files changed, 19 insertions, 10 deletions
diff --git a/src/analysis/collections.cpp b/src/analysis/collections.cpp index 92dd51f..4fb861d 100644 --- a/src/analysis/collections.cpp +++ b/src/analysis/collections.cpp @@ -17,10 +17,11 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include "analysis/analysis.h" +#include "analysis/collections.h" #include "logger.h" +#include "analysis/analysis.h" #include "analysis/walkitem.h" #include "localconsts.h" @@ -52,6 +53,7 @@ void addNeedCheckNullVars2(WalkItem &wi, WalkItem &wo) wo.removeNullVars.erase(it); wo.removeNullVarsAll.erase(it); wo.addNullVars.insert(it); + removeLinkVarOnly(wo, it); } } } @@ -104,16 +106,8 @@ void removeNeedCheckNullVarsSetAll(WalkItem &wi, std::set<std::string> &vars) } } -void removeNeedCheckNullVarOnly(WalkItem &wi, const std::string &var) +void removeLinkVarOnly(WalkItem &wi, const std::string &var) { - if (isIn(var, wi.needCheckNullVars)) - { - wi.needCheckNullVars.erase(var); - } - if (isIn(var, wi.addNullVars)) - { - wi.addNullVars.erase(var); - } auto it2 = wi.linkedVars.find(var); if (it2 != wi.linkedVars.end()) { @@ -146,6 +140,19 @@ void removeNeedCheckNullVarOnly(WalkItem &wi, const std::string &var) wi.linkedReverseVars.erase(var); } +void removeNeedCheckNullVarOnly(WalkItem &wi, const std::string &var) +{ + if (isIn(var, wi.needCheckNullVars)) + { + wi.needCheckNullVars.erase(var); + } + if (isIn(var, wi.addNullVars)) + { + wi.addNullVars.erase(var); + } + removeLinkVarOnly(wi, var); +} + // remove vars from checks for null pointer without linked vars void removeNeedCheckNullVarsSet(WalkItem &wi, std::set<std::string> &vars) { diff --git a/src/analysis/collections.h b/src/analysis/collections.h index 8a50376..a03cbe5 100644 --- a/src/analysis/collections.h +++ b/src/analysis/collections.h @@ -84,6 +84,8 @@ namespace Analysis void removeVar(WalkItem &wi, const std::string &var); void enforceNeedCheckNullVars(WalkItem &wi); + + void removeLinkVarOnly(WalkItem &wi, const std::string &var); } #endif // ANALYSIS_COLLECTIONS_H |