From be6e1735147a73427412e101fd924938ec6880d3 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sat, 8 Aug 2015 16:33:09 +0300 Subject: Add support for non null pointer attribute in PARM_DECL nodes. --- src/analysis/expression.cpp | 25 ++++++++++++++++++++++++- src/parsers/decl/parm_decl.cpp | 4 ++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp index f14bc2d..6af1d78 100644 --- a/src/analysis/expression.cpp +++ b/src/analysis/expression.cpp @@ -163,6 +163,16 @@ VarItem getComponentRefVariable(Node *node) Node *ref = skipNop(indirect->ref); if (ref && !isValidVar(ref->label)) return str; + if (ref == PARM_DECL) + { + ParmDeclNode *parmDecl = static_cast(ref); + if (findTreeListPurpose(static_cast( + skipNop(parmDecl->attribute)), + "nonnullpointer")) + { + str.isNonNull = true; + } + } if (ref == VAR_DECL) { VarDeclNode *varDecl = static_cast(ref); @@ -219,10 +229,17 @@ std::vector getComponentRefParts(Node *node) if (ref == PARM_DECL) { ParmDeclNode *parmDecl = static_cast(ref); + bool isNonNull2(false); + if (findTreeListPurpose(static_cast( + skipNop(parmDecl->attribute)), + "nonnullpointer")) + { + isNonNull2 = true; + } if (skipNop(parmDecl->declType) == nullptr || skipNop(parmDecl->declType) == POINTER_TYPE) { - str.push_back(VarItem(ref->label, false)); + str.push_back(VarItem(ref->label, isNonNull2)); } } if (ref == VAR_DECL) @@ -281,6 +298,12 @@ std::vector getComponentRefLeftParts(Node *node) if (ref == PARM_DECL) { ParmDeclNode *parmDecl = static_cast(ref); + if (findTreeListPurpose(static_cast( + skipNop(parmDecl->attribute)), + "nonnullpointer")) + { + isNonNull = true; + } if (skipNop(parmDecl->declType) != nullptr && skipNop(parmDecl->declType) != POINTER_TYPE) { diff --git a/src/parsers/decl/parm_decl.cpp b/src/parsers/decl/parm_decl.cpp index 0f2e966..3a38a8d 100644 --- a/src/parsers/decl/parm_decl.cpp +++ b/src/parsers/decl/parm_decl.cpp @@ -40,11 +40,11 @@ void parseParmDeclNode(ParmDeclNode *node) fillDeclAutoGenerated(node); + fillDeclAttributes(node); + if (node->parseChilds <= 0) return; - fillDeclAttributes(node); - node->declType = static_cast(createParseNode( node, DECL_ARG_TYPE(node->gccNode), -- cgit v1.2.3-60-g2f50