diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-06-24 02:00:45 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-06-24 02:00:45 +0300 |
commit | 0115abd5dc7cc43a6e84c21bab03324fd37a5f32 (patch) | |
tree | d35dd3ea8c6f04e5e004ab8f139b9c1b3c693e1d /src/analysis/expression.cpp | |
parent | 1dd7b4d1b57122c2ada615042d3ea6002b1ae59c (diff) | |
download | paranucker-0115abd5dc7cc43a6e84c21bab03324fd37a5f32.tar.gz paranucker-0115abd5dc7cc43a6e84c21bab03324fd37a5f32.tar.bz2 paranucker-0115abd5dc7cc43a6e84c21bab03324fd37a5f32.tar.xz paranucker-0115abd5dc7cc43a6e84c21bab03324fd37a5f32.zip |
Check only first function parameter and only if this is not FUNCTION_DECL.
Diffstat (limited to 'src/analysis/expression.cpp')
-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); } |