diff options
-rw-r--r-- | src/analysis/analysis.cpp | 4 | ||||
-rw-r--r-- | src/analysis/expression.cpp | 25 | ||||
-rw-r--r-- | src/analysis/expression.h | 3 | ||||
-rw-r--r-- | src/analysis/walkitem.h | 8 |
4 files changed, 37 insertions, 3 deletions
diff --git a/src/analysis/analysis.cpp b/src/analysis/analysis.cpp index 9a890dd..459e517 100644 --- a/src/analysis/analysis.cpp +++ b/src/analysis/analysis.cpp @@ -34,6 +34,7 @@ #include "nodes/expr/addr_expr.h" #include "nodes/expr/modify_expr.h" +#include "nodes/expr/ne_expr.h" #include "nodes/expr/nop_expr.h" #include "nodes/expr/pointerplus_expr.h" #include "nodes/expr/return_expr.h" @@ -177,6 +178,9 @@ void analyseNode(Node *node, const WalkItem &wi, WalkItem &wo) case MODIFY_EXPR: analyseModifyExpr(static_cast<ModifyExprNode*>(node), wi2, wo); break; + case NE_EXPR: + analyseNeExpr(static_cast<NeExprNode*>(node), wi2, wo); + break; case RETURN_EXPR: analyseReturnExpr(static_cast<ReturnExprNode*>(node), wi2, wo); break; diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp index 3d9f0f6..666d448 100644 --- a/src/analysis/expression.cpp +++ b/src/analysis/expression.cpp @@ -27,6 +27,7 @@ #include "nodes/expr/addr_expr.h" #include "nodes/expr/modify_expr.h" +#include "nodes/expr/ne_expr.h" #include "nodes/expr/pointerplus_expr.h" #include "nodes/expr/return_expr.h" @@ -77,4 +78,28 @@ void analyseReturnExpr(ReturnExprNode *node, const WalkItem &wi, WalkItem &wo) wo.isReturned = true; } +void analyseNeExpr(NeExprNode *node, const WalkItem &wi, WalkItem &wo) +{ + // need atleast one arg for check + if (node->args.size() < 2 || !wi.isExpr || command == FindArgs) + return; + + // PARM_DECL? + Node *node1 = skipNop(node->args[0]); + // INTEGER_CST? + Node *node2 = skipNop(node->args[1]); + + // if (var != 0) + if (node1 && + node2 && + node1->nodeType == PARM_DECL && + node2->nodeType == INTEGER_CST && + wi.checkNullVars.find(node1->label) != wi.checkNullVars.end() && + node2->label == "0") + { + wo.removeNullVars.insert(node1->label); + wo.checkNullVars.erase(node1->label); + } +} + } diff --git a/src/analysis/expression.h b/src/analysis/expression.h index de459a6..1360118 100644 --- a/src/analysis/expression.h +++ b/src/analysis/expression.h @@ -24,6 +24,7 @@ struct AddrExprNode; struct ModifyExprNode; +struct NeExprNode; struct PointerPlusExprNode; struct ReturnExprNode; struct WalkItem; @@ -37,6 +38,8 @@ namespace Analysis void analyseAddrExpr(AddrExprNode *node, const WalkItem &wi, WalkItem &wo); void analyseReturnExpr(ReturnExprNode *node, const WalkItem &wi, WalkItem &wo); + + void analyseNeExpr(NeExprNode *node, const WalkItem &wi, WalkItem &wo); } #endif // ANALYSIS_EXPRESSION_H diff --git a/src/analysis/walkitem.h b/src/analysis/walkitem.h index 04e14b9..29352c0 100644 --- a/src/analysis/walkitem.h +++ b/src/analysis/walkitem.h @@ -29,7 +29,8 @@ struct WalkItem checkNullVars(), removeNullVars(), stopWalking(false), - isReturned(false) + isReturned(false), + isExpr(false) { } @@ -43,8 +44,9 @@ struct WalkItem std::set<std::string> checkNullVars; std::set<std::string> removeNullVars; - bool stopWalking; - bool isReturned; + bool stopWalking; // stop walking on tree after this node + bool isReturned; // set if return present in child nodes + bool isExpr; // set if walking on expression for if other kind nodes }; |