diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-07-02 15:23:08 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-07-02 15:23:08 +0300 |
commit | c90126b3a8751cce8d196531c7fb0154a88ce986 (patch) | |
tree | 32c7fc0d7ba19907cc19e4f7742afb77f1904151 /src/analysis/expression.cpp | |
parent | 704ae5e19d0b02850b97311df082da23dcbe1a34 (diff) | |
download | paranucker-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.cpp | 30 |
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); + } + } } } } |