diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-07-02 17:54:28 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-07-02 17:54:28 +0300 |
commit | 0c1d5e1d8f31c5738457e641b389489fa3beca8d (patch) | |
tree | d528ac09cb04bba1abee1362c72f3ec5e16a683c | |
parent | 18766cbf04ece6fee906accedd8d4192af761b84 (diff) | |
download | paranucker-0c1d5e1d8f31c5738457e641b389489fa3beca8d.tar.gz paranucker-0c1d5e1d8f31c5738457e641b389489fa3beca8d.tar.bz2 paranucker-0c1d5e1d8f31c5738457e641b389489fa3beca8d.tar.xz paranucker-0c1d5e1d8f31c5738457e641b389489fa3beca8d.zip |
Add into function for linking variables also update for knownVars sets.
-rw-r--r-- | src/analysis/collections.cpp | 22 | ||||
-rw-r--r-- | src/analysis/expression.cpp | 7 |
2 files changed, 26 insertions, 3 deletions
diff --git a/src/analysis/collections.cpp b/src/analysis/collections.cpp index b53ba9a..3c11481 100644 --- a/src/analysis/collections.cpp +++ b/src/analysis/collections.cpp @@ -126,6 +126,28 @@ void addLinkedVar(WalkItem &wi, std::string parent, const std::string &var) { + if (isIn(parent, wi.addNullVars) || + isIn(parent, wi.needCheckNullVars)) + { + wi.addNullVars.insert(var); + wi.removeNullVars.erase(var); + } + if (isIn(parent, wi.removeNullVars)) + { + wi.removeNullVars.insert(var); + wi.addNullVars.erase(var); + } + if (isIn(parent, wi.knownNullVars)) + { + wi.knownNullVars.insert(var); + wi.knownNonNullVars.erase(var); + } + else if (isIn(parent, wi.knownNonNullVars)) + { + wi.knownNonNullVars.insert(var); + wi.knownNullVars.erase(var); + } + // found parent as already linked var. need change parent to real parent if (isIn(parent, wi.linkedReverseVars)) parent = wi.linkedReverseVars[parent]; diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp index bed47ef..8576557 100644 --- a/src/analysis/expression.cpp +++ b/src/analysis/expression.cpp @@ -127,6 +127,9 @@ void analyseModifyExpr(ModifyExprNode *node, const WalkItem &wi, WalkItem &wo) isNotIn(var2, wi.knownVars)) { wo.removeNullVars.insert(var1); + wo.knownVars.erase(var1); + wo.knownNullVars.erase(var1); + wo.knownNonNullVars.erase(var1); } reportParmDeclNullPointer(node, @@ -144,9 +147,8 @@ void analyseModifyExpr(ModifyExprNode *node, const WalkItem &wi, WalkItem &wo) } else { // have var1 and var2 (var1 = var2) - if (isIn(var2, wi.needCheckNullVars)) + if (isIn(var2, wi.knownVars)) { - addNullVar(wo, var1); addLinkedVar(wo, var2, var1); } // var2 not found in known checking pointer @@ -705,7 +707,6 @@ void handleSetVar(Node *node1, return; if (isNotIn(var2, wi.needCheckNullVars)) return; - addNullVar(wo, var1); addLinkedVar(wo, var2, var1); } |