diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/analysis/collections.cpp | 27 | ||||
-rw-r--r-- | src/analysis/expression.cpp | 3 | ||||
-rw-r--r-- | src/analysis/statement.cpp | 12 |
3 files changed, 20 insertions, 22 deletions
diff --git a/src/analysis/collections.cpp b/src/analysis/collections.cpp index 0f3a8f8..92dd51f 100644 --- a/src/analysis/collections.cpp +++ b/src/analysis/collections.cpp @@ -35,13 +35,6 @@ void addNeedCheckNullVars(WalkItem &wi, WalkItem &wo) { wo.needCheckNullVars.insert(it); wo.knownVars.insert(it); -/* - wo.knownNonNullVars.erase(it); - wo.knownNullVars.erase(it); - wo.removeNullVars.erase(it); - wo.removeNullVarsAll.erase(it); - wo.addNullVars.insert(it); -*/ } } @@ -50,13 +43,16 @@ void addNeedCheckNullVars2(WalkItem &wi, WalkItem &wo) { FOR_EACH (it, wi.addNullVars) { - wo.needCheckNullVars.insert(it); - wo.knownVars.insert(it); - wo.knownNonNullVars.erase(it); - wo.knownNullVars.erase(it); - wo.removeNullVars.erase(it); - wo.removeNullVarsAll.erase(it); - wo.addNullVars.insert(it); + if (isNotIn(it, wo.addNullVars)) + { + wo.needCheckNullVars.insert(it); + wo.knownVars.insert(it); + wo.knownNonNullVars.erase(it); + wo.knownNullVars.erase(it); + wo.removeNullVars.erase(it); + wo.removeNullVarsAll.erase(it); + wo.addNullVars.insert(it); + } } } @@ -167,6 +163,7 @@ void addUnknownVar(WalkItem &wi, wi.knownNonNullVars.erase(var); wi.addNullVars.insert(var); wi.removeNullVars.erase(var); + wi.removeNullVarsAll.erase(var); } void addNonNullVar(WalkItem &wi, @@ -184,7 +181,7 @@ void addLinkedVar(WalkItem &wi, std::string parent, const std::string &var) { - //Log::log("add var: %s, %s\n", parent.c_str(), var.c_str()); + //Log::log("addLinkedVar: %s, %s\n", parent.c_str(), var.c_str()); if (isIn(parent, wi.addNullVars) || isIn(parent, wi.needCheckNullVars)) { diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp index b6e00ca..683623a 100644 --- a/src/analysis/expression.cpp +++ b/src/analysis/expression.cpp @@ -165,12 +165,13 @@ void analyseModifyExpr(ModifyExprNode *node, const WalkItem &wi, WalkItem &wo) else if (!var1.empty()) { if (var2.empty()) - { // have var1 only (var1 = UNKNOWN) + { // have var1 only (var1 = UNKNOWN or var1 = function(...)) bool handled(false); if (node->args[1] == CALL_EXPR && isPointerArg(arg)) { handled = handleSetVarToFunction(var1, node->args[1], wo); } + // have var1 only (var1 = UNKNOWN) if (!handled) removeVar(wo, var1); } diff --git a/src/analysis/statement.cpp b/src/analysis/statement.cpp index dd370fa..1d64ac3 100644 --- a/src/analysis/statement.cpp +++ b/src/analysis/statement.cpp @@ -122,9 +122,9 @@ void analyseCondition(Node *node, addKnownNullVarsWithLinked(wo, wco, wco.checkedElseNullVars); } } - else + else if (thenNode) { -// addNeedCheckNullVars2(wo2, wo); + addNeedCheckNullVars2(wo2, wo); } if (wo3.isReturned) { @@ -140,9 +140,9 @@ void analyseCondition(Node *node, addKnownNullVarsWithLinked(wo, wco, wco.checkedThenNullVars); } } - else + else if (elseNode) { -// addNeedCheckNullVars2(wo3, wo); + addNeedCheckNullVars2(wo3, wo); } if (wo2.isReturned && wo3.isReturned) { @@ -229,9 +229,9 @@ void analyseWhileStmt(WhileStmtNode *node, const WalkItem &wi, WalkItem &wo) addKnownNullVarsWithLinked(wo, wco, wco.checkedElseNullVars); } } - else + else if (bodyNode) { -// addNeedCheckNullVars2(wo2, wo); + addNeedCheckNullVars2(wo2, wo); } wo.isReturned = false; |