summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-07-02 17:54:28 +0300
committerAndrei Karas <akaras@inbox.ru>2015-07-02 17:54:28 +0300
commit0c1d5e1d8f31c5738457e641b389489fa3beca8d (patch)
treed528ac09cb04bba1abee1362c72f3ec5e16a683c
parent18766cbf04ece6fee906accedd8d4192af761b84 (diff)
downloadparanucker-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.cpp22
-rw-r--r--src/analysis/expression.cpp7
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);
}