summaryrefslogtreecommitdiff
path: root/src/analysis/expression.cpp
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-06-18 00:59:55 +0300
committerAndrei Karas <akaras@inbox.ru>2015-06-18 00:59:55 +0300
commitf414be9da2934e8601ee2d6e85500e5bbab5ceca (patch)
treeec1dfc9658da95244247cacb987100d1d482dca1 /src/analysis/expression.cpp
parent5d40bf6be5aa4652c20a6520ceec452533ce9ee5 (diff)
downloadparanucker-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.cpp25
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);
+ }
+}
+
}