summaryrefslogtreecommitdiff
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
parent5d40bf6be5aa4652c20a6520ceec452533ce9ee5 (diff)
downloadparanucker-f414be9da2934e8601ee2d6e85500e5bbab5ceca.tar.gz
paranucker-f414be9da2934e8601ee2d6e85500e5bbab5ceca.tar.bz2
paranucker-f414be9da2934e8601ee2d6e85500e5bbab5ceca.tar.xz
paranucker-f414be9da2934e8601ee2d6e85500e5bbab5ceca.zip
Add basic analysis for node NE_EXPR.
-rw-r--r--src/analysis/analysis.cpp4
-rw-r--r--src/analysis/expression.cpp25
-rw-r--r--src/analysis/expression.h3
-rw-r--r--src/analysis/walkitem.h8
4 files changed, 37 insertions, 3 deletions
diff --git a/src/analysis/analysis.cpp b/src/analysis/analysis.cpp
index 9a890dd..459e517 100644
--- a/src/analysis/analysis.cpp
+++ b/src/analysis/analysis.cpp
@@ -34,6 +34,7 @@
#include "nodes/expr/addr_expr.h"
#include "nodes/expr/modify_expr.h"
+#include "nodes/expr/ne_expr.h"
#include "nodes/expr/nop_expr.h"
#include "nodes/expr/pointerplus_expr.h"
#include "nodes/expr/return_expr.h"
@@ -177,6 +178,9 @@ void analyseNode(Node *node, const WalkItem &wi, WalkItem &wo)
case MODIFY_EXPR:
analyseModifyExpr(static_cast<ModifyExprNode*>(node), wi2, wo);
break;
+ case NE_EXPR:
+ analyseNeExpr(static_cast<NeExprNode*>(node), wi2, wo);
+ break;
case RETURN_EXPR:
analyseReturnExpr(static_cast<ReturnExprNode*>(node), wi2, wo);
break;
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);
+ }
+}
+
}
diff --git a/src/analysis/expression.h b/src/analysis/expression.h
index de459a6..1360118 100644
--- a/src/analysis/expression.h
+++ b/src/analysis/expression.h
@@ -24,6 +24,7 @@
struct AddrExprNode;
struct ModifyExprNode;
+struct NeExprNode;
struct PointerPlusExprNode;
struct ReturnExprNode;
struct WalkItem;
@@ -37,6 +38,8 @@ namespace Analysis
void analyseAddrExpr(AddrExprNode *node, const WalkItem &wi, WalkItem &wo);
void analyseReturnExpr(ReturnExprNode *node, const WalkItem &wi, WalkItem &wo);
+
+ void analyseNeExpr(NeExprNode *node, const WalkItem &wi, WalkItem &wo);
}
#endif // ANALYSIS_EXPRESSION_H
diff --git a/src/analysis/walkitem.h b/src/analysis/walkitem.h
index 04e14b9..29352c0 100644
--- a/src/analysis/walkitem.h
+++ b/src/analysis/walkitem.h
@@ -29,7 +29,8 @@ struct WalkItem
checkNullVars(),
removeNullVars(),
stopWalking(false),
- isReturned(false)
+ isReturned(false),
+ isExpr(false)
{
}
@@ -43,8 +44,9 @@ struct WalkItem
std::set<std::string> checkNullVars;
std::set<std::string> removeNullVars;
- bool stopWalking;
- bool isReturned;
+ bool stopWalking; // stop walking on tree after this node
+ bool isReturned; // set if return present in child nodes
+ bool isExpr; // set if walking on expression for if other kind nodes
};