diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-06-27 01:07:48 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-06-27 01:07:48 +0300 |
commit | c07fb0bd0a56d2f4a040a0b06a5d00de9444895b (patch) | |
tree | 12818dcdb647b25247986bcacb4823589fde2c46 /src | |
parent | acc94996b12758248d8ce991a71ecc703efd85cf (diff) | |
download | paranucker-c07fb0bd0a56d2f4a040a0b06a5d00de9444895b.tar.gz paranucker-c07fb0bd0a56d2f4a040a0b06a5d00de9444895b.tar.bz2 paranucker-c07fb0bd0a56d2f4a040a0b06a5d00de9444895b.tar.xz paranucker-c07fb0bd0a56d2f4a040a0b06a5d00de9444895b.zip |
Allow check function pointers in arrays.
Diffstat (limited to 'src')
-rw-r--r-- | src/analysis/expression.cpp | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp index 4d4c429..2c0dba3 100644 --- a/src/analysis/expression.cpp +++ b/src/analysis/expression.cpp @@ -49,6 +49,7 @@ #include "nodes/decl/function_decl.h" #include "nodes/decl/var_decl.h" +#include "nodes/ref/array_ref.h" #include "nodes/ref/component_ref.h" #include "nodes/ref/indirect_ref.h" @@ -458,16 +459,18 @@ void analyseCallExpr(CallExprNode *node, const WalkItem &wi, WalkItem &wo) if (node->function) { walkTree(node->function, wi, wo2); + Node *function = skipNop(node->function); Log::dumpWI(node, "wo function ", wo2); - if (node->function == ADDR_EXPR) + if (function == ADDR_EXPR) { - AddrExprNode *addrNode = static_cast<AddrExprNode*>(node->function); + AddrExprNode *addrNode = static_cast<AddrExprNode*>(function); if (!addrNode->args.empty()) { - if (addrNode->args[0] == FUNCTION_DECL) + Node *decl = skipNop(addrNode->args[0]); + if (decl == FUNCTION_DECL) { FunctionDeclNode *declNode = static_cast<FunctionDeclNode*>( - addrNode->args[0]); + decl); if (declNode->functionType == FUNCTION_TYPE) { enableCheck = false; @@ -481,8 +484,14 @@ void analyseCallExpr(CallExprNode *node, const WalkItem &wi, WalkItem &wo) } else { - reportParmDeclNullPointer(node, node->function, wi); - if (!getVariableName(node->function).empty()) + if (function == ARRAY_REF) + { + ArrayRefNode *arrRef = static_cast<ArrayRefNode*>(function); + if (!arrRef->args.empty() && arrRef->args[0] == COMPONENT_REF) + function = arrRef->args[0]; + } + reportParmDeclNullPointer(node, function, wi); + if (!getVariableName(function).empty()) enableCheck = false; } } |