diff options
-rw-r--r-- | src/analysis/analysis.cpp | 4 | ||||
-rw-r--r-- | src/analysis/expression.cpp | 6 | ||||
-rw-r--r-- | src/analysis/expression.h | 3 | ||||
-rw-r--r-- | src/analysis/statement.cpp | 21 | ||||
-rw-r--r-- | src/analysis/walkitem.h | 7 |
5 files changed, 34 insertions, 7 deletions
diff --git a/src/analysis/analysis.cpp b/src/analysis/analysis.cpp index f690d25..d4d0917 100644 --- a/src/analysis/analysis.cpp +++ b/src/analysis/analysis.cpp @@ -36,6 +36,7 @@ #include "nodes/expr/modify_expr.h" #include "nodes/expr/nop_expr.h" #include "nodes/expr/pointerplus_expr.h" +#include "nodes/expr/return_expr.h" #include "nodes/ref/component_ref.h" @@ -170,6 +171,9 @@ void analyseNode(Node *node, const WalkItem &wi, WalkItem &wo) case MODIFY_EXPR: analyseModifyExpr(static_cast<ModifyExprNode*>(node), wi2, wo); break; + case RETURN_EXPR: + analyseReturnExpr(static_cast<ReturnExprNode*>(node), wi2, wo); + break; case POINTER_PLUS_EXPR: analysePointerPlusExpr(static_cast<PointerPlusExprNode*>(node), wi2, wo); break; diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp index 1a0593f..3d9f0f6 100644 --- a/src/analysis/expression.cpp +++ b/src/analysis/expression.cpp @@ -28,6 +28,7 @@ #include "nodes/expr/addr_expr.h" #include "nodes/expr/modify_expr.h" #include "nodes/expr/pointerplus_expr.h" +#include "nodes/expr/return_expr.h" #include "nodes/ref/indirect_ref.h" @@ -71,4 +72,9 @@ void analyseAddrExpr(AddrExprNode *node, const WalkItem &wi, WalkItem &wo) reportParmDeclNullPointer(node, node->args[0], wi); } +void analyseReturnExpr(ReturnExprNode *node, const WalkItem &wi, WalkItem &wo) +{ + wo.isReturned = true; +} + } diff --git a/src/analysis/expression.h b/src/analysis/expression.h index eb7fa79..de459a6 100644 --- a/src/analysis/expression.h +++ b/src/analysis/expression.h @@ -25,6 +25,7 @@ struct AddrExprNode; struct ModifyExprNode; struct PointerPlusExprNode; +struct ReturnExprNode; struct WalkItem; namespace Analysis @@ -34,6 +35,8 @@ namespace Analysis void analysePointerPlusExpr(PointerPlusExprNode *node, const WalkItem &wi, WalkItem &wo); void analyseAddrExpr(AddrExprNode *node, const WalkItem &wi, WalkItem &wo); + + void analyseReturnExpr(ReturnExprNode *node, const WalkItem &wi, WalkItem &wo); } #endif // ANALYSIS_EXPRESSION_H diff --git a/src/analysis/statement.cpp b/src/analysis/statement.cpp index fd1cbf2..7a5c467 100644 --- a/src/analysis/statement.cpp +++ b/src/analysis/statement.cpp @@ -72,6 +72,7 @@ void analyseIfStmt(IfStmtNode *node, const WalkItem &wi, WalkItem &wo) // walking to then branch walkTree(node->thenNode, wi2, wo); wo.removeNullVars.clear(); + const bool returned = wo.isReturned; // From else branch remove variable what we just found. wi2 = wi; @@ -80,12 +81,14 @@ void analyseIfStmt(IfStmtNode *node, const WalkItem &wi, WalkItem &wo) wo.removeNullVars.clear(); wo.stopWalking = true; - //Log::log("add removeNullVars: %s\n", node1->label.c_str()); - // add variable for ignore for all parent nodes except special like IF_STMT - wo.removeNullVars.insert(node1->label); - wo.checkNullVars.erase(node1->label); + if (returned) + { + //Log::log("add removeNullVars: %s\n", node1->label.c_str()); + // add variable for ignore for all parent nodes except special like IF_STMT + wo.removeNullVars.insert(node1->label); + wo.checkNullVars.erase(node1->label); + } - // need check what return present return; } } @@ -120,6 +123,14 @@ void analyseIfStmt(IfStmtNode *node, const WalkItem &wi, WalkItem &wo) walkTree(node->elseNode, wi2, wo); wo.removeNullVars.clear(); wo.stopWalking = true; + + if (wo.isReturned && node->elseNode) + { + //Log::log("add removeNullVars: %s\n", node1->label.c_str()); + // add variable for ignore for all parent nodes except special like IF_STMT + wo.removeNullVars.insert(node1->label); + wo.checkNullVars.erase(node1->label); + } return; } } diff --git a/src/analysis/walkitem.h b/src/analysis/walkitem.h index d91d91a..7e06d38 100644 --- a/src/analysis/walkitem.h +++ b/src/analysis/walkitem.h @@ -28,20 +28,23 @@ struct WalkItem WalkItem() : checkNullVars(), removeNullVars(), - stopWalking(false) + stopWalking(false), + isReturned(true) { } WalkItem(const WalkItem &item) : checkNullVars(item.checkNullVars), removeNullVars(item.removeNullVars), - stopWalking(item.stopWalking) + stopWalking(item.stopWalking), + isReturned(item.isReturned) { } std::set<std::string> checkNullVars; std::set<std::string> removeNullVars; bool stopWalking; + bool isReturned; }; |