diff options
-rw-r--r-- | src/analysis/analysis.cpp | 9 | ||||
-rw-r--r-- | src/analysis/analysis.h | 3 | ||||
-rw-r--r-- | src/analysis/expression.cpp | 40 | ||||
-rw-r--r-- | src/analysis/function.cpp | 2 |
4 files changed, 35 insertions, 19 deletions
diff --git a/src/analysis/analysis.cpp b/src/analysis/analysis.cpp index bb6b93e..45abe97 100644 --- a/src/analysis/analysis.cpp +++ b/src/analysis/analysis.cpp @@ -217,6 +217,15 @@ bool checkForReport(Node *node, wi.checkNullVars.find(node->label) != wi.checkNullVars.end(); } +// report about useless check for null pointer +void reportUselessCheck(Node *node, + const std::string &var) +{ + Log::warn(findBackLocation(node), + "Useless variable check '%s'. It already was checked before", + var); +} + // report about null pointer if need for node void reportParmDeclNullPointer(Node *mainNode, Node *node, diff --git a/src/analysis/analysis.h b/src/analysis/analysis.h index b371ab3..0c4e10f 100644 --- a/src/analysis/analysis.h +++ b/src/analysis/analysis.h @@ -46,6 +46,9 @@ namespace Analysis Node *node, const WalkItem &wi); + void reportUselessCheck(Node *node, + const std::string &var); + bool checkForReport(Node *node, const WalkItem &wi); diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp index e521615..4683dee 100644 --- a/src/analysis/expression.cpp +++ b/src/analysis/expression.cpp @@ -193,18 +193,22 @@ void analyseNeExpr(NeExprNode *node, const WalkItem &wi, WalkItem &wo) // if (var != 0) if (!var.empty() && node2 == INTEGER_CST && - wi.checkNullVars.find(var) != wi.checkNullVars.end() && node2->label == "0") { - wo.checkedNonNullVars.insert(var); - wo.cleanExpr = true; - wo.uselessExpr = false; - } - else - { - wo.cleanExpr = false; - wo.uselessExpr = true; + if (wi.checkNullVars.find(var) != wi.checkNullVars.end()) + { + wo.checkedNonNullVars.insert(var); + wo.cleanExpr = true; + wo.uselessExpr = false; + return; + } + else if (wi.knownVars.find(var) != wi.knownVars.end()) + { + reportUselessCheck(node, var); + } } + wo.cleanExpr = false; + wo.uselessExpr = true; } void analyseEqExpr(EqExprNode *node, const WalkItem &wi, WalkItem &wo) @@ -221,18 +225,18 @@ void analyseEqExpr(EqExprNode *node, const WalkItem &wi, WalkItem &wo) // if (var == 0) if (!var.empty() && node2 == INTEGER_CST && - wi.checkNullVars.find(var) != wi.checkNullVars.end() && node2->label == "0") { - wo.checkedNullVars.insert(var); - wo.cleanExpr = true; - wo.uselessExpr = false; - } - else - { - wo.cleanExpr = false; - wo.uselessExpr = true; + if (wi.checkNullVars.find(var) != wi.checkNullVars.end()) + { + wo.checkedNullVars.insert(var); + wo.cleanExpr = true; + wo.uselessExpr = false; + return; + } } + wo.cleanExpr = false; + wo.uselessExpr = true; } void analyseOrCondition(Node *node, Node *node1, Node *node2, const WalkItem &wi, WalkItem &wo) diff --git a/src/analysis/function.cpp b/src/analysis/function.cpp index 6197e0a..20ead8f 100644 --- a/src/analysis/function.cpp +++ b/src/analysis/function.cpp @@ -147,8 +147,8 @@ void analyseFunction(FunctionDeclNode *node, const WalkItem &wi, WalkItem &wo) WalkItem wi2 = wi; getPossibleNullParameters(node, wi2); walkTree(node->code, wi2, wo); - wo.stopWalking = true; } + wo.stopWalking = true; } } |