summaryrefslogtreecommitdiff
path: root/src
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
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')
-rw-r--r--src/analysis/expression.cpp16
-rw-r--r--src/parsers/type/array_type.cpp3
-rw-r--r--src/parsers/type/boolean_type.cpp3
-rw-r--r--src/parsers/type/enumeral_type.cpp3
-rw-r--r--src/parsers/type/function_type.cpp10
-rw-r--r--src/parsers/type/method_type.cpp10
-rw-r--r--src/parsers/type/real_type.cpp3
-rw-r--r--src/parsers/type/reference_type.cpp3
-rw-r--r--src/parsers/type/typename_type.cpp3
-rw-r--r--src/parsers/type/union_type.cpp3
-rw-r--r--src/parsers/type/vector_type.cpp3
11 files changed, 52 insertions, 8 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
diff --git a/src/parsers/type/array_type.cpp b/src/parsers/type/array_type.cpp
index f4b30dc..5c8c237 100644
--- a/src/parsers/type/array_type.cpp
+++ b/src/parsers/type/array_type.cpp
@@ -35,6 +35,9 @@ void parseArrayTypeNode(ArrayTypeNode *node)
setPrintField(node, TYPE_STRING_FLAG, isString);
+ if (!node->parseChilds)
+ return;
+
fillTypeName(node);
fillTypeAttributes(node);
diff --git a/src/parsers/type/boolean_type.cpp b/src/parsers/type/boolean_type.cpp
index e5f5f0d..c6624fd 100644
--- a/src/parsers/type/boolean_type.cpp
+++ b/src/parsers/type/boolean_type.cpp
@@ -33,6 +33,9 @@ void parseBooleanTypeNode(BooleanTypeNode *node)
fillType(node);
Log::dump(node);
+ if (!node->parseChilds)
+ return;
+
fillTypeName(node);
fillTypeAttributes(node);
}
diff --git a/src/parsers/type/enumeral_type.cpp b/src/parsers/type/enumeral_type.cpp
index 6557acd..3ab0140 100644
--- a/src/parsers/type/enumeral_type.cpp
+++ b/src/parsers/type/enumeral_type.cpp
@@ -40,6 +40,9 @@ void parseEnumeralTypeNode(EnumeralTypeNode *node)
else
Log::dumpRaw(node, "- signed");
+ if (!node->parseChilds)
+ return;
+
fillTypeName(node);
fillTypeAttributes(node);
diff --git a/src/parsers/type/function_type.cpp b/src/parsers/type/function_type.cpp
index b6e3116..2b0bdb4 100644
--- a/src/parsers/type/function_type.cpp
+++ b/src/parsers/type/function_type.cpp
@@ -33,14 +33,16 @@ void parseFunctionTypeNode(FunctionTypeNode *node)
fillType(node);
Log::dump(node);
+ node->returnType = static_cast<TypeNode*>(createParseNode(
+ node,
+ TREE_TYPE(node->gccNode),
+ "function return type",
+ node->parseChilds));
+
if (!node->parseChilds)
return;
fillTypeName(node);
- node->returnType = static_cast<TypeNode*>(createParseNode(
- node,
- TREE_TYPE(node->gccNode),
- "function return type"));
fillTypeAttributes(node);
node->argTypes = static_cast<TreeListNode*>(createParseNode(
node,
diff --git a/src/parsers/type/method_type.cpp b/src/parsers/type/method_type.cpp
index 827752f..5fb61ce 100644
--- a/src/parsers/type/method_type.cpp
+++ b/src/parsers/type/method_type.cpp
@@ -35,15 +35,17 @@ void parseMethodTypeNode(MethodTypeNode *node)
fillTypeAttributes(node);
+ node->returnType = static_cast<TypeNode*>(createParseNode(
+ node,
+ TREE_TYPE(node->gccNode),
+ "method return type",
+ node->parseChilds));
+
if (!node->parseChilds)
return;
fillTypeName(node);
- node->returnType = static_cast<TypeNode*>(createParseNode(
- node,
- TREE_TYPE(node->gccNode),
- "method return type"));
node->methodBaseType = static_cast<TypeNode*>(createParseNode(
node,
diff --git a/src/parsers/type/real_type.cpp b/src/parsers/type/real_type.cpp
index f71ffbe..09daebd 100644
--- a/src/parsers/type/real_type.cpp
+++ b/src/parsers/type/real_type.cpp
@@ -35,6 +35,9 @@ void parseRealTypeNode(RealTypeNode *node)
setPrintField(node, TYPE_PRECISION, precisionBits);
+ if (!node->parseChilds)
+ return;
+
fillTypeName(node);
fillTypeAttributes(node);
}
diff --git a/src/parsers/type/reference_type.cpp b/src/parsers/type/reference_type.cpp
index 9e697be..a225f5f 100644
--- a/src/parsers/type/reference_type.cpp
+++ b/src/parsers/type/reference_type.cpp
@@ -33,6 +33,9 @@ void parseReferenceTypeNode(ReferenceTypeNode *node)
fillType(node);
Log::dump(node);
+ if (!node->parseChilds)
+ return;
+
fillTypeName(node);
fillTypeAttributes(node);
node->nestedType = static_cast<TypeNode*>(createParseNode(
diff --git a/src/parsers/type/typename_type.cpp b/src/parsers/type/typename_type.cpp
index a926348..c295b79 100644
--- a/src/parsers/type/typename_type.cpp
+++ b/src/parsers/type/typename_type.cpp
@@ -39,6 +39,9 @@ void parseTypeNameTypeNode(TypeNameTypeNode *node)
setPrintField(node, TYPENAME_IS_RESOLVING_P, isResolving);
#endif
+ if (!node->parseChilds)
+ return;
+
fillTypeName(node);
fillTypeAttributes(node);
diff --git a/src/parsers/type/union_type.cpp b/src/parsers/type/union_type.cpp
index 6663051..392dd63 100644
--- a/src/parsers/type/union_type.cpp
+++ b/src/parsers/type/union_type.cpp
@@ -33,6 +33,9 @@ void parseUnionTypeNode(UnionTypeNode *node)
fillType(node);
Log::dump(node);
+ if (!node->parseChilds)
+ return;
+
fillTypeName(node);
fillTypeAttributes(node);
diff --git a/src/parsers/type/vector_type.cpp b/src/parsers/type/vector_type.cpp
index 1e49551..82dfac8 100644
--- a/src/parsers/type/vector_type.cpp
+++ b/src/parsers/type/vector_type.cpp
@@ -35,6 +35,9 @@ void parseVectorTypeNode(VectorTypeNode *node)
setPrintField(node, TYPE_VECTOR_SUBPARTS, vectorSize);
+ if (!node->parseChilds)
+ return;
+
fillTypeName(node);
fillTypeAttributes(node);