summaryrefslogtreecommitdiff
path: root/src/analysis/expression.cpp
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-07-06 19:46:29 +0300
committerAndrei Karas <akaras@inbox.ru>2015-07-06 19:54:44 +0300
commit11ffbed13d101e4bd625f9433006a664fe24f95f (patch)
tree1f49349afd666a4123a7e6189803607163b8f496 /src/analysis/expression.cpp
parent64626d6f9f399cd6ae367e449d51943284513886 (diff)
downloadparanucker-11ffbed13d101e4bd625f9433006a664fe24f95f.tar.gz
paranucker-11ffbed13d101e4bd625f9433006a664fe24f95f.tar.bz2
paranucker-11ffbed13d101e4bd625f9433006a664fe24f95f.tar.xz
paranucker-11ffbed13d101e4bd625f9433006a664fe24f95f.zip
Track variable for checking null pointer assigned from function call only if function return pointer.
Update METHOD_TYPE for always parse function return type.
Diffstat (limited to 'src/analysis/expression.cpp')
-rw-r--r--src/analysis/expression.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp
index 7c5194e..b6e00ca 100644
--- a/src/analysis/expression.cpp
+++ b/src/analysis/expression.cpp
@@ -59,6 +59,8 @@
#include "nodes/ref/indirect_ref.h"
#include "nodes/ref/objtype_ref.h"
+#include "nodes/type/method_type.h"
+
#include <set>
#include "localconsts.h"
@@ -103,6 +105,10 @@ bool isPointerArg(Node *node)
if (skipNop(var->varType) == POINTER_TYPE)
return true;
}
+ else if (node == COMPONENT_REF)
+ {
+ return true;
+ }
return false;
}
@@ -752,6 +758,16 @@ bool handleSetVarToFunction(const std::string &var,
if (!func->functionType)
return false;
+ Node *returnType;
+ if (func->functionType == FUNCTION_TYPE)
+ returnType = static_cast<FunctionTypeNode*>(func->functionType)->returnType;
+ else if (func->functionType == METHOD_TYPE)
+ returnType = static_cast<MethodTypeNode*>(func->functionType)->returnType;
+ else
+ return false;
+ if (returnType != POINTER_TYPE)
+ return false;
+
if (findTreeListPurpose(static_cast<TreeListNode*>(func->functionType->attribute),
"returns_nonnull"))
{ // function have attribute returns_nonnull. This mean result cant be null