diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-06-18 00:59:55 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-06-18 00:59:55 +0300 |
commit | f414be9da2934e8601ee2d6e85500e5bbab5ceca (patch) | |
tree | ec1dfc9658da95244247cacb987100d1d482dca1 /src/analysis/expression.cpp | |
parent | 5d40bf6be5aa4652c20a6520ceec452533ce9ee5 (diff) | |
download | paranucker-f414be9da2934e8601ee2d6e85500e5bbab5ceca.tar.gz paranucker-f414be9da2934e8601ee2d6e85500e5bbab5ceca.tar.bz2 paranucker-f414be9da2934e8601ee2d6e85500e5bbab5ceca.tar.xz paranucker-f414be9da2934e8601ee2d6e85500e5bbab5ceca.zip |
Add basic analysis for node NE_EXPR.
Diffstat (limited to 'src/analysis/expression.cpp')
-rw-r--r-- | src/analysis/expression.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp index 3d9f0f6..666d448 100644 --- a/src/analysis/expression.cpp +++ b/src/analysis/expression.cpp @@ -27,6 +27,7 @@ #include "nodes/expr/addr_expr.h" #include "nodes/expr/modify_expr.h" +#include "nodes/expr/ne_expr.h" #include "nodes/expr/pointerplus_expr.h" #include "nodes/expr/return_expr.h" @@ -77,4 +78,28 @@ void analyseReturnExpr(ReturnExprNode *node, const WalkItem &wi, WalkItem &wo) wo.isReturned = true; } +void analyseNeExpr(NeExprNode *node, const WalkItem &wi, WalkItem &wo) +{ + // need atleast one arg for check + if (node->args.size() < 2 || !wi.isExpr || command == FindArgs) + return; + + // PARM_DECL? + Node *node1 = skipNop(node->args[0]); + // INTEGER_CST? + Node *node2 = skipNop(node->args[1]); + + // if (var != 0) + if (node1 && + node2 && + node1->nodeType == PARM_DECL && + node2->nodeType == INTEGER_CST && + wi.checkNullVars.find(node1->label) != wi.checkNullVars.end() && + node2->label == "0") + { + wo.removeNullVars.insert(node1->label); + wo.checkNullVars.erase(node1->label); + } +} + } |