diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/analysis/expression.cpp | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp index 28e7bb8..78b3d8e 100644 --- a/src/analysis/expression.cpp +++ b/src/analysis/expression.cpp @@ -385,13 +385,32 @@ void analyseCallExpr(CallExprNode *node, const WalkItem &wi, WalkItem &wo) walkTree(node->chain, wi, wo2); Log::dumpWI(node, "wo chain ", wo2); wo2 = wo; - walkTree(node->function, wi, wo2); - Log::dumpWI(node, "wo function ", wo2); + bool enableCheck(true); + if (node->function) + { + walkTree(node->function, wi, wo2); + Log::dumpWI(node, "wo function ", wo2); + if (node->function->nodeType == ADDR_EXPR) + { + AddrExprNode *addrNode = static_cast<AddrExprNode*>(node->function); + if (!addrNode->args.empty()) + { + if (addrNode->args[0]->nodeType == FUNCTION_TYPE) + { + enableCheck = false; + } + } + } + } FOR_EACH (std::vector<Node*>::const_iterator, it, node->args) { wo2 = wo; Node *node2 = skipNop(*it); - reportParmDeclNullPointer(node, node2, wi); + if (enableCheck) + { + reportParmDeclNullPointer(node, node2, wi); + enableCheck = false; + } walkTree(node2, wi, wo2); Log::dumpWI(node, "wo arg ", wo2); } |