summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/analysis/analysis.cpp9
-rw-r--r--src/analysis/analysis.h2
-rw-r--r--src/analysis/expression.cpp16
3 files changed, 27 insertions, 0 deletions
diff --git a/src/analysis/analysis.cpp b/src/analysis/analysis.cpp
index 6d57274..3cd7215 100644
--- a/src/analysis/analysis.cpp
+++ b/src/analysis/analysis.cpp
@@ -227,6 +227,15 @@ Node *skipNop(Node *node)
return node;
}
+Node *skipBackNop(Node *node)
+{
+ while (node && node->nodeType == NOP_EXPR)
+ {
+ node = node->parent;
+ }
+ return node;
+}
+
void mergeNullChecked(WalkItem &wi1, WalkItem &wi2)
{
wi1.checkedNullVars.insert(wi2.checkedNullVars.begin(),
diff --git a/src/analysis/analysis.h b/src/analysis/analysis.h
index fe3d295..59608c2 100644
--- a/src/analysis/analysis.h
+++ b/src/analysis/analysis.h
@@ -56,6 +56,8 @@ namespace Analysis
Node *skipNop(Node *node);
+ Node *skipBackNop(Node *node);
+
void mergeNullChecked(WalkItem &wi1, WalkItem &wi2);
void mergeNonNullChecked(WalkItem &wi1, WalkItem &wi2);
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp
index c3fb050..a31f78f 100644
--- a/src/analysis/expression.cpp
+++ b/src/analysis/expression.cpp
@@ -28,6 +28,7 @@
#include "nodes/expr/addr_expr.h"
#include "nodes/expr/bind_expr.h"
+#include "nodes/expr/call_expr.h"
#include "nodes/expr/compound_expr.h"
#include "nodes/expr/cond_expr.h"
#include "nodes/expr/decl_expr.h"
@@ -83,6 +84,21 @@ void analyseAddrExpr(AddrExprNode *node, const WalkItem &wi, WalkItem &wo)
if (node->args.empty() || command == FindArgs)
return;
+ // do not report code like func1(ptr) or push_back(ptr)
+ Node *node2 = skipBackNop(node->parent);
+ if (node2)
+ {
+ while (node2 && node2->nodeType == ADDR_EXPR)
+ {
+ node2 = skipBackNop(node2->parent);
+ }
+ // found what some parent is function or method call
+ if (node2 && node2->nodeType == CALL_EXPR)
+ {
+ return;
+ }
+ }
+
reportParmDeclNullPointer(node, node->args[0], wi);
}