summaryrefslogtreecommitdiff
path: root/src/analysis/expression.cpp
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-07-02 15:23:08 +0300
committerAndrei Karas <akaras@inbox.ru>2015-07-02 15:23:08 +0300
commitc90126b3a8751cce8d196531c7fb0154a88ce986 (patch)
tree32c7fc0d7ba19907cc19e4f7742afb77f1904151 /src/analysis/expression.cpp
parent704ae5e19d0b02850b97311df082da23dcbe1a34 (diff)
downloadparanucker-c90126b3a8751cce8d196531c7fb0154a88ce986.tar.gz
paranucker-c90126b3a8751cce8d196531c7fb0154a88ce986.tar.bz2
paranucker-c90126b3a8751cce8d196531c7fb0154a88ce986.tar.xz
paranucker-c90126b3a8751cce8d196531c7fb0154a88ce986.zip
Remove variable from checked vars if variable assigned unknown expression.
For now it can be call to function or some complicated expression.
Diffstat (limited to 'src/analysis/expression.cpp')
-rw-r--r--src/analysis/expression.cpp30
1 files changed, 20 insertions, 10 deletions
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp
index 16e062d..bed47ef 100644
--- a/src/analysis/expression.cpp
+++ b/src/analysis/expression.cpp
@@ -133,22 +133,32 @@ void analyseModifyExpr(ModifyExprNode *node, const WalkItem &wi, WalkItem &wo)
static_cast<IndirectRefNode*>(arg)->ref,
wi);
}
- else if (!var1.empty() && !var2.empty())
+ else if (!var1.empty())
{
- if (isIn(var2, wi.needCheckNullVars))
- {
- addNullVar(wo, var1);
- addLinkedVar(wo, var2, var1);
- }
- // var2 not found in known checking pointer
- else if (isNotIn(var2, wi.needCheckNullVars) &&
- isNotIn(var2, wi.knownVars))
- {
+ if (var2.empty())
+ { // have var1 only (var1 = UNKNOWN)
wo.removeNullVars.insert(var1);
wo.knownVars.erase(var1);
wo.knownNullVars.erase(var1);
wo.knownNonNullVars.erase(var1);
}
+ else
+ { // have var1 and var2 (var1 = var2)
+ if (isIn(var2, wi.needCheckNullVars))
+ {
+ addNullVar(wo, var1);
+ addLinkedVar(wo, var2, var1);
+ }
+ // var2 not found in known checking pointer
+ else if (isNotIn(var2, wi.needCheckNullVars) &&
+ isNotIn(var2, wi.knownVars))
+ {
+ wo.removeNullVars.insert(var1);
+ wo.knownVars.erase(var1);
+ wo.knownNullVars.erase(var1);
+ wo.knownNonNullVars.erase(var1);
+ }
+ }
}
}
}