summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-08-04 18:43:41 +0300
committerAndrei Karas <akaras@inbox.ru>2015-08-04 18:43:41 +0300
commitf4469e5aa2771ed14ffaa478b9b593503dfd732f (patch)
treef4e37a89142ca0803cbe2e940dca44b4614b2578 /src
parent5ed02db7e12dd4f373aeb07baf535c08a5f99fcf (diff)
downloadparanucker-f4469e5aa2771ed14ffaa478b9b593503dfd732f.tar.gz
paranucker-f4469e5aa2771ed14ffaa478b9b593503dfd732f.tar.bz2
paranucker-f4469e5aa2771ed14ffaa478b9b593503dfd732f.tar.xz
paranucker-f4469e5aa2771ed14ffaa478b9b593503dfd732f.zip
Ignore variables if FIELD_DECL have attribute nonnullpointer.
Diffstat (limited to 'src')
-rw-r--r--src/analysis/expression.cpp20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp
index fbb86d8..e64026c 100644
--- a/src/analysis/expression.cpp
+++ b/src/analysis/expression.cpp
@@ -152,6 +152,12 @@ std::string getComponentRefVariable(Node *node)
FieldDeclNode *fieldDecl = static_cast<FieldDeclNode*>(field);
if (fieldDecl->fieldType != POINTER_TYPE)
return str;
+ if (findTreeListPurpose(static_cast<TreeListNode*>(
+ skipNop(fieldDecl->attribute)),
+ "nonnullpointer"))
+ {
+ return str;
+ }
IndirectRefNode *indirect = static_cast<IndirectRefNode*>(object);
Node *ref = skipNop(indirect->ref);
if (ref && !isValidVar(ref->label))
@@ -204,6 +210,12 @@ std::vector<std::string> getComponentRefParts(Node *node)
{
FieldDeclNode *fieldDecl = static_cast<FieldDeclNode*>(field);
IndirectRefNode *indirect = static_cast<IndirectRefNode*>(object);
+ if (findTreeListPurpose(static_cast<TreeListNode*>(
+ skipNop(fieldDecl->attribute)),
+ "nonnullpointer"))
+ {
+ return str;
+ }
Node *ref = skipNop(indirect->ref);
if (ref && !isValidVar(ref->label))
return str;
@@ -254,9 +266,15 @@ std::vector<std::string> getComponentRefLeftParts(Node *node)
if (object == INDIRECT_REF &&
field == FIELD_DECL)
{
-// FieldDeclNode *fieldDecl = static_cast<FieldDeclNode*>(field);
+ FieldDeclNode *fieldDecl = static_cast<FieldDeclNode*>(field);
// if (fieldDecl->fieldType != POINTER_TYPE)
// return str;
+ if (findTreeListPurpose(static_cast<TreeListNode*>(
+ skipNop(fieldDecl->attribute)),
+ "nonnullpointer"))
+ {
+ return str;
+ }
IndirectRefNode *indirect = static_cast<IndirectRefNode*>(object);
Node *ref = skipNop(indirect->ref);
if (ref && !isValidVar(ref->label))