summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-06-17 21:48:47 +0300
committerAndrei Karas <akaras@inbox.ru>2015-06-17 21:48:47 +0300
commitada4bce8b0199d2f5c42a64f391ccab441ec6429 (patch)
tree7b22ae30ab372e4ca00194369db62c38536b9869
parentbdfcd0d5ebd5465ea8a46bf3760a3d41de603532 (diff)
downloadparanucker-ada4bce8b0199d2f5c42a64f391ccab441ec6429.tar.gz
paranucker-ada4bce8b0199d2f5c42a64f391ccab441ec6429.tar.bz2
paranucker-ada4bce8b0199d2f5c42a64f391ccab441ec6429.tar.xz
paranucker-ada4bce8b0199d2f5c42a64f391ccab441ec6429.zip
Add fake support for checking is return present inside if statemenets.
-rw-r--r--src/analysis/analysis.cpp4
-rw-r--r--src/analysis/expression.cpp6
-rw-r--r--src/analysis/expression.h3
-rw-r--r--src/analysis/statement.cpp21
-rw-r--r--src/analysis/walkitem.h7
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;
};