summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/analysis/analysis.cpp9
-rw-r--r--src/analysis/analysis.h3
-rw-r--r--src/analysis/expression.cpp40
-rw-r--r--src/analysis/function.cpp2
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;
}
}