summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-06-23 02:47:21 +0300
committerAndrei Karas <akaras@inbox.ru>2015-06-23 02:47:21 +0300
commit25aea8acd5ba7aa87c88b7b16a146c667096bf62 (patch)
tree484ace0a925c45c59c869d31e8c1348d6fbe1023 /src
parent351dc2643c2799a6a34f7feb72ca7da7558646c2 (diff)
downloadparanucker-25aea8acd5ba7aa87c88b7b16a146c667096bf62.tar.gz
paranucker-25aea8acd5ba7aa87c88b7b16a146c667096bf62.tar.bz2
paranucker-25aea8acd5ba7aa87c88b7b16a146c667096bf62.tar.xz
paranucker-25aea8acd5ba7aa87c88b7b16a146c667096bf62.zip
Combine analysis code for IF_STMT and COND_EXPR into same function.
Diffstat (limited to 'src')
-rw-r--r--src/analysis/expression.cpp89
-rw-r--r--src/analysis/statement.cpp32
-rw-r--r--src/analysis/statement.h12
3 files changed, 38 insertions, 95 deletions
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp
index 330d079..621be38 100644
--- a/src/analysis/expression.cpp
+++ b/src/analysis/expression.cpp
@@ -23,6 +23,7 @@
#include "logger.h"
#include "analysis/analysis.h"
+#include "analysis/statement.h"
#include "analysis/walkitem.h"
#include "nodes/expr/addr_expr.h"
@@ -224,92 +225,12 @@ void analyseCondExpr(CondExprNode *node, const WalkItem &wi, WalkItem &wo)
if (node->args.size() < 3 || command == FindArgs)
return;
- Log::dumpWI(node, "wo in ", wo);
- WalkItem wo1 = wo;
- WalkItem wo2 = wo;
- WalkItem wo3 = wo;
-
- // walk condition
- walkTree(node->args[0], wi, wo1);
- Log::dumpWI(node, "wo1 ", wo1);
- WalkItem wi2 = wi;
- removeCheckNullVarsSet(wi2, wo1.checkedNonNullVars);
- wi2.checkNullVars.insert(wo1.checkedNullVars.begin(),
- wo1.checkedNullVars.end());
- Log::dumpWI(node, "wi2 ", wi2);
-
- reportParmDeclNullPointer(node,
+ analyseCondition(node,
+ node->args[0],
node->args[1],
- wi2);
- // walk true expr
- walkTree(node->args[1], wi2, wo2);
- Log::dumpWI(node, "wo2 ", wo2);
-
- WalkItem wi3 = wi;
- removeCheckNullVarsSet(wi3, wo1.checkedNullVars);
- wi3.checkNullVars.insert(wo1.checkedNonNullVars.begin(),
- wo1.checkedNonNullVars.end());
- Log::dumpWI(node, "wi3 ", wi3);
-
- reportParmDeclNullPointer(node,
node->args[2],
- wi3);
- // walk true expr
- walkTree(node->args[2], wi3, wo3);
- Log::dumpWI(node, "wo3 ", wo3);
-
- // probably condition wrong
- if (wo2.cleanExpr)
- mergeNullChecked(wo, wo2);
- // probably condition wrong
- if (wo3.cleanExpr)
- mergeNullChecked(wo, wo3);
- // need check for cleanExpr?
- intersectNonNullChecked(wo, wo2, wo3);
-
- //wo.removeNullVars.clear();
-
- if (wo2.isReturned)
- {
- // add variable for ignore for all parent nodes except special like IF_STMT
- FOR_EACH (std::set<std::string>::const_iterator,
- it,
- wo1.checkedNullVars)
- {
- wo.removeNullVars.insert(*it);
- wo.checkNullVars.erase(*it);
- wo.addNullVars.erase(*it);
- }
- }
- if (wo3.isReturned)
- {
- // add variable for ignore for all parent nodes except special like IF_STMT
- FOR_EACH (std::set<std::string>::const_iterator,
- it,
- wo1.checkedNonNullVars)
- {
- wo.removeNullVars.insert(*it);
- wo.checkNullVars.erase(*it);
- wo.addNullVars.erase(*it);
- }
- }
-
- if (wo2.isReturned && wo3.isReturned)
- {
- // add variable for ignore for all parent nodes except special like IF_STMT
- FOR_EACH (std::set<std::string>::const_iterator,
- it,
- wo.checkNullVars)
- {
- wo.removeNullVars.insert(*it);
- }
- }
-
- wo.isReturned = false;
- wo.cleanExpr = true;
- wo.stopWalking = true;
- wo.uselessExpr = false;
- Log::dumpWI(node, "wo out ", wo);
+ wi,
+ wo);
}
// expression like this (expr1, expr2, ..., exprn). Only have sense exprn.
diff --git a/src/analysis/statement.cpp b/src/analysis/statement.cpp
index 6393b0f..666b4ec 100644
--- a/src/analysis/statement.cpp
+++ b/src/analysis/statement.cpp
@@ -41,13 +41,16 @@
namespace Analysis
{
-void analyseIfStmt(IfStmtNode *node, const WalkItem &wi, WalkItem &wo)
+void analyseCondition(Node *node,
+ Node *condNode,
+ Node *thenNode,
+ Node *elseNode,
+ const WalkItem &wi,
+ WalkItem &wo)
{
- // need condition node
- if (!node->condition || command == FindArgs)
- return;
-
- Node *condNode = skipNop(node->condition);
+ condNode = skipNop(condNode);
+ thenNode = skipNop(thenNode);
+ elseNode = skipNop(elseNode);
WalkItem wci = wi;
WalkItem wco = wo;
@@ -63,9 +66,9 @@ void analyseIfStmt(IfStmtNode *node, const WalkItem &wi, WalkItem &wo)
Log::dumpWI(node, "wi2 then ", wi2);
reportParmDeclNullPointer(node,
- node->thenNode,
+ thenNode,
wi2);
- walkTree(node->thenNode, wi2, wo2);
+ walkTree(thenNode, wi2, wo2);
Log::dumpWI(node, "wo2 then ", wo2);
WalkItem wi3 = wi;
@@ -75,9 +78,9 @@ void analyseIfStmt(IfStmtNode *node, const WalkItem &wi, WalkItem &wo)
Log::dumpWI(node, "wi3 else ", wi3);
reportParmDeclNullPointer(node,
- node->elseNode,
+ elseNode,
wi3);
- walkTree(node->elseNode, wi3, wo3);
+ walkTree(elseNode, wi3, wo3);
Log::dumpWI(node, "wo3 else ", wo3);
// probably condition wrong
@@ -131,4 +134,13 @@ void analyseIfStmt(IfStmtNode *node, const WalkItem &wi, WalkItem &wo)
wo.uselessExpr = false;
}
+void analyseIfStmt(IfStmtNode *node, const WalkItem &wi, WalkItem &wo)
+{
+ // need condition node
+ if (!node->condition || command == FindArgs)
+ return;
+
+ analyseCondition(node, node->condition, node->thenNode, node->elseNode, wi, wo);
+}
+
}
diff --git a/src/analysis/statement.h b/src/analysis/statement.h
index 7c2cd2f..3a414df 100644
--- a/src/analysis/statement.h
+++ b/src/analysis/statement.h
@@ -23,11 +23,21 @@
#include "includes.h"
struct IfStmtNode;
+struct Node;
struct WalkItem;
namespace Analysis
{
- void analyseIfStmt(IfStmtNode *node, const WalkItem &wi, WalkItem &wo);
+ void analyseCondition(Node *node,
+ Node *condNode,
+ Node *thenNode,
+ Node *elseNode,
+ const WalkItem &wi,
+ WalkItem &wo);
+
+ void analyseIfStmt(IfStmtNode *node,
+ const WalkItem &wi,
+ WalkItem &wo);
}
#endif // ANALYSIS_STATEMENT_H