summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-07-10 16:33:44 +0300
committerAndrei Karas <akaras@inbox.ru>2015-07-10 16:33:44 +0300
commit8d71522916ba1e1058f362ecd69316b1a2a702cc (patch)
tree00c956d9d178c1821fba41362be66e83fa874ef6
parent2fbe80e73b358c5017e3dff849732c7922c6ddd5 (diff)
downloadparanucker-8d71522916ba1e1058f362ecd69316b1a2a702cc.tar.gz
paranucker-8d71522916ba1e1058f362ecd69316b1a2a702cc.tar.bz2
paranucker-8d71522916ba1e1058f362ecd69316b1a2a702cc.tar.xz
paranucker-8d71522916ba1e1058f362ecd69316b1a2a702cc.zip
Unlink assigned variable in if/while body.
-rw-r--r--src/analysis/collections.cpp27
-rw-r--r--src/analysis/collections.h2
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