summaryrefslogtreecommitdiff
path: root/src/analysis/expression.cpp
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/analysis/expression.cpp
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/analysis/expression.cpp')
-rw-r--r--src/analysis/expression.cpp89
1 files changed, 5 insertions, 84 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.