diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-06-23 02:47:21 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-06-23 02:47:21 +0300 |
commit | 25aea8acd5ba7aa87c88b7b16a146c667096bf62 (patch) | |
tree | 484ace0a925c45c59c869d31e8c1348d6fbe1023 /src/analysis | |
parent | 351dc2643c2799a6a34f7feb72ca7da7558646c2 (diff) | |
download | paranucker-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')
-rw-r--r-- | src/analysis/expression.cpp | 89 | ||||
-rw-r--r-- | src/analysis/statement.cpp | 32 | ||||
-rw-r--r-- | src/analysis/statement.h | 12 |
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 |