summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-06-25 01:52:43 +0300
committerAndrei Karas <akaras@inbox.ru>2015-06-25 01:52:43 +0300
commit6df4368beeb6fc37aeeff5b0698ce75053cb05ea (patch)
treea0a9b40218c00a09f26a742c16cfd80514400810 /src
parent208e4517bd230b1cab6325fcf6a263e69f38bf51 (diff)
downloadparanucker-6df4368beeb6fc37aeeff5b0698ce75053cb05ea.tar.gz
paranucker-6df4368beeb6fc37aeeff5b0698ce75053cb05ea.tar.bz2
paranucker-6df4368beeb6fc37aeeff5b0698ce75053cb05ea.tar.xz
paranucker-6df4368beeb6fc37aeeff5b0698ce75053cb05ea.zip
Add into analysis node NON_LVALUE_EXPR.
It works like NOP node.
Diffstat (limited to 'src')
-rw-r--r--src/analysis/analysis.cpp8
-rw-r--r--src/analysis/expression.cpp11
-rw-r--r--src/analysis/expression.h3
3 files changed, 21 insertions, 1 deletions
diff --git a/src/analysis/analysis.cpp b/src/analysis/analysis.cpp
index 5401002..f0dc245 100644
--- a/src/analysis/analysis.cpp
+++ b/src/analysis/analysis.cpp
@@ -42,6 +42,7 @@
#include "nodes/expr/eq_expr.h"
#include "nodes/expr/modify_expr.h"
#include "nodes/expr/ne_expr.h"
+#include "nodes/expr/nonlvalue_expr.h"
#include "nodes/expr/nop_expr.h"
#include "nodes/expr/pointerplus_expr.h"
#include "nodes/expr/return_expr.h"
@@ -250,7 +251,9 @@ void reportParmDeclNullPointer(Node *mainNode,
Node *skipNop(Node *node)
{
- while (node && node->nodeType == NOP_EXPR)
+ while (node &&
+ (node->nodeType == NOP_EXPR ||
+ node->nodeType == NON_LVALUE_EXPR))
{
NopExprNode *nop = static_cast<NopExprNode*>(node);
if (nop && !nop->args.empty())
@@ -398,6 +401,9 @@ void analyseNode(Node *node, const WalkItem &wi, WalkItem &wo)
case POINTER_PLUS_EXPR:
analysePointerPlusExpr(static_cast<PointerPlusExprNode*>(node), wi2, wo);
break;
+ case NON_LVALUE_EXPR:
+ analyseNonLvalueExpr(static_cast<NonLvalueExprNode*>(node), wi2, wo);
+ break;
case VAR_DECL:
analyseVarDecl(static_cast<VarDeclNode*>(node), wi2, wo);
break;
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp
index 6b7654c..959cc79 100644
--- a/src/analysis/expression.cpp
+++ b/src/analysis/expression.cpp
@@ -36,6 +36,7 @@
#include "nodes/expr/eq_expr.h"
#include "nodes/expr/modify_expr.h"
#include "nodes/expr/ne_expr.h"
+#include "nodes/expr/nonlvalue_expr.h"
#include "nodes/expr/nop_expr.h"
#include "nodes/expr/pointerplus_expr.h"
#include "nodes/expr/return_expr.h"
@@ -444,6 +445,16 @@ void analyseNopExpr(NopExprNode *node, const WalkItem &wi, WalkItem &wo)
wo.stopWalking = true;
}
+void analyseNonLvalueExpr(NonLvalueExprNode *node, const WalkItem &wi, WalkItem &wo)
+{
+ // need one arg for check
+ if (node->args.empty())
+ return;
+
+ walkTree(node->args[0], wi, wo);
+ wo.stopWalking = true;
+}
+
void analyseCallExpr(CallExprNode *node, const WalkItem &wi, WalkItem &wo)
{
WalkItem wo2 = wo;
diff --git a/src/analysis/expression.h b/src/analysis/expression.h
index 84890dd..825f73a 100644
--- a/src/analysis/expression.h
+++ b/src/analysis/expression.h
@@ -33,6 +33,7 @@ struct EqExprNode;
struct ModifyExprNode;
struct NeExprNode;
struct Node;
+struct NonLvalueExprNode;
struct NopExprNode;
struct PointerPlusExprNode;
struct ReturnExprNode;
@@ -78,6 +79,8 @@ namespace Analysis
void analyseNopExpr(NopExprNode *node, const WalkItem &wi, WalkItem &wo);
+ void analyseNonLvalueExpr(NonLvalueExprNode *node, const WalkItem &wi, WalkItem &wo);
+
std::string getComponentRefVariable(Node *node);
}