From c90126b3a8751cce8d196531c7fb0154a88ce986 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Thu, 2 Jul 2015 15:23:08 +0300 Subject: Remove variable from checked vars if variable assigned unknown expression. For now it can be call to function or some complicated expression. --- src/analysis/expression.cpp | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) (limited to 'src') 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(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); + } + } } } } -- cgit v1.2.3-60-g2f50