diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-06-21 01:38:37 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-06-21 01:38:37 +0300 |
commit | 105529f34d3f9b04661a8caf4842c0eeea9d1838 (patch) | |
tree | 93e10721c7fd27833bc4d124057f766d081c896a | |
parent | ea10f7bf8cadb21a392b06e1c7f50dcffca7ea89 (diff) | |
download | paranucker-105529f34d3f9b04661a8caf4842c0eeea9d1838.tar.gz paranucker-105529f34d3f9b04661a8caf4842c0eeea9d1838.tar.bz2 paranucker-105529f34d3f9b04661a8caf4842c0eeea9d1838.tar.xz paranucker-105529f34d3f9b04661a8caf4842c0eeea9d1838.zip |
fix COND_EXPR for C code.
In C code COND_EXPR used like IF_STMT in C++.
-rw-r--r-- | src/analysis/expression.cpp | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp index c3d97cf..9f21577 100644 --- a/src/analysis/expression.cpp +++ b/src/analysis/expression.cpp @@ -261,6 +261,43 @@ void analyseCondExpr(CondExprNode *node, const WalkItem &wi, WalkItem &wo) // 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); + } + } + 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); + } + } + + 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, + wo1.checkedNullVars) + { + wo.removeNullVars.insert(*it); + } + } + + wo.isReturned = false; wo.cleanExpr = true; wo.stopWalking = true; wo.uselessExpr = false; |