summaryrefslogtreecommitdiff
path: root/src/analysis
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis')
-rw-r--r--src/analysis/expression.cpp25
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);
}