summaryrefslogtreecommitdiff
path: root/src/analysis/expression.cpp
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-06-24 02:00:45 +0300
committerAndrei Karas <akaras@inbox.ru>2015-06-24 02:00:45 +0300
commit0115abd5dc7cc43a6e84c21bab03324fd37a5f32 (patch)
treed35dd3ea8c6f04e5e004ab8f139b9c1b3c693e1d /src/analysis/expression.cpp
parent1dd7b4d1b57122c2ada615042d3ea6002b1ae59c (diff)
downloadparanucker-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.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);
}