diff options
| author | Andrei Karas <akaras@inbox.ru> | 2015-06-25 01:52:43 +0300 |
|---|---|---|
| committer | Andrei Karas <akaras@inbox.ru> | 2015-06-25 01:52:43 +0300 |
| commit | 6df4368beeb6fc37aeeff5b0698ce75053cb05ea (patch) | |
| tree | a0a9b40218c00a09f26a742c16cfd80514400810 /src | |
| parent | 208e4517bd230b1cab6325fcf6a263e69f38bf51 (diff) | |
| download | paranucker-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.cpp | 8 | ||||
| -rw-r--r-- | src/analysis/expression.cpp | 11 | ||||
| -rw-r--r-- | src/analysis/expression.h | 3 |
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); } |