summaryrefslogtreecommitdiff
path: root/src/analysis/expression.cpp
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-06-27 01:07:48 +0300
committerAndrei Karas <akaras@inbox.ru>2015-06-27 01:07:48 +0300
commitc07fb0bd0a56d2f4a040a0b06a5d00de9444895b (patch)
tree12818dcdb647b25247986bcacb4823589fde2c46 /src/analysis/expression.cpp
parentacc94996b12758248d8ce991a71ecc703efd85cf (diff)
downloadparanucker-c07fb0bd0a56d2f4a040a0b06a5d00de9444895b.tar.gz
paranucker-c07fb0bd0a56d2f4a040a0b06a5d00de9444895b.tar.bz2
paranucker-c07fb0bd0a56d2f4a040a0b06a5d00de9444895b.tar.xz
paranucker-c07fb0bd0a56d2f4a040a0b06a5d00de9444895b.zip
Allow check function pointers in arrays.
Diffstat (limited to 'src/analysis/expression.cpp')
-rw-r--r--src/analysis/expression.cpp21
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;
}
}