diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/analysis/analysis.cpp | 9 | ||||
-rw-r--r-- | src/analysis/analysis.h | 2 | ||||
-rw-r--r-- | src/analysis/expression.cpp | 16 |
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); } |