diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-07-06 19:46:29 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-07-06 19:54:44 +0300 |
commit | 11ffbed13d101e4bd625f9433006a664fe24f95f (patch) | |
tree | 1f49349afd666a4123a7e6189803607163b8f496 /src | |
parent | 64626d6f9f399cd6ae367e449d51943284513886 (diff) | |
download | paranucker-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.cpp | 16 | ||||
-rw-r--r-- | src/parsers/type/array_type.cpp | 3 | ||||
-rw-r--r-- | src/parsers/type/boolean_type.cpp | 3 | ||||
-rw-r--r-- | src/parsers/type/enumeral_type.cpp | 3 | ||||
-rw-r--r-- | src/parsers/type/function_type.cpp | 10 | ||||
-rw-r--r-- | src/parsers/type/method_type.cpp | 10 | ||||
-rw-r--r-- | src/parsers/type/real_type.cpp | 3 | ||||
-rw-r--r-- | src/parsers/type/reference_type.cpp | 3 | ||||
-rw-r--r-- | src/parsers/type/typename_type.cpp | 3 | ||||
-rw-r--r-- | src/parsers/type/union_type.cpp | 3 | ||||
-rw-r--r-- | src/parsers/type/vector_type.cpp | 3 |
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); |