summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-06-18 12:22:21 +0300
committerAndrei Karas <akaras@inbox.ru>2015-06-18 12:22:21 +0300
commitd2b4c53238a9c455eb15d58526b7e5f43100f457 (patch)
treefd3d4fcf7342cd64778b08f668e68a65e61b0cc5
parentf414be9da2934e8601ee2d6e85500e5bbab5ceca (diff)
downloadparanucker-d2b4c53238a9c455eb15d58526b7e5f43100f457.tar.gz
paranucker-d2b4c53238a9c455eb15d58526b7e5f43100f457.tar.bz2
paranucker-d2b4c53238a9c455eb15d58526b7e5f43100f457.tar.xz
paranucker-d2b4c53238a9c455eb15d58526b7e5f43100f457.zip
Add basic analysis for nodes EQ_EXPR and TRUTH_ORIF_EXPR.
-rw-r--r--src/analysis/analysis.cpp8
-rw-r--r--src/analysis/expression.cpp32
-rw-r--r--src/analysis/expression.h6
3 files changed, 45 insertions, 1 deletions
diff --git a/src/analysis/analysis.cpp b/src/analysis/analysis.cpp
index 459e517..ecdb079 100644
--- a/src/analysis/analysis.cpp
+++ b/src/analysis/analysis.cpp
@@ -33,11 +33,13 @@
#include "nodes/decl/var_decl.h"
#include "nodes/expr/addr_expr.h"
+#include "nodes/expr/eq_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"
+#include "nodes/expr/truthorif_expr.h"
#include "nodes/ref/component_ref.h"
@@ -181,6 +183,12 @@ void analyseNode(Node *node, const WalkItem &wi, WalkItem &wo)
case NE_EXPR:
analyseNeExpr(static_cast<NeExprNode*>(node), wi2, wo);
break;
+ case EQ_EXPR:
+ analyseEqExpr(static_cast<EqExprNode*>(node), wi2, wo);
+ break;
+ case TRUTH_ORIF_EXPR:
+ analyseTruthOrIfExpr(static_cast<TruthOrIfExprNode*>(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 666d448..c057f88 100644
--- a/src/analysis/expression.cpp
+++ b/src/analysis/expression.cpp
@@ -26,10 +26,12 @@
#include "analysis/walkitem.h"
#include "nodes/expr/addr_expr.h"
+#include "nodes/expr/eq_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"
+#include "nodes/expr/truthorif_expr.h"
#include "nodes/ref/indirect_ref.h"
@@ -80,7 +82,7 @@ void analyseReturnExpr(ReturnExprNode *node, const WalkItem &wi, WalkItem &wo)
void analyseNeExpr(NeExprNode *node, const WalkItem &wi, WalkItem &wo)
{
- // need atleast one arg for check
+ // need two args for check
if (node->args.size() < 2 || !wi.isExpr || command == FindArgs)
return;
@@ -102,4 +104,32 @@ void analyseNeExpr(NeExprNode *node, const WalkItem &wi, WalkItem &wo)
}
}
+void analyseEqExpr(EqExprNode *node, const WalkItem &wi, WalkItem &wo)
+{
+ // need two args 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")
+ {
+ }
+*/
+// do nothing for now
+}
+
+void analyseTruthOrIfExpr(TruthOrIfExprNode *node, const WalkItem &wi, WalkItem &wo)
+{
+}
+
}
diff --git a/src/analysis/expression.h b/src/analysis/expression.h
index 1360118..9d2aef8 100644
--- a/src/analysis/expression.h
+++ b/src/analysis/expression.h
@@ -23,10 +23,12 @@
#include "includes.h"
struct AddrExprNode;
+struct EqExprNode;
struct ModifyExprNode;
struct NeExprNode;
struct PointerPlusExprNode;
struct ReturnExprNode;
+struct TruthOrIfExprNode;
struct WalkItem;
namespace Analysis
@@ -40,6 +42,10 @@ namespace Analysis
void analyseReturnExpr(ReturnExprNode *node, const WalkItem &wi, WalkItem &wo);
void analyseNeExpr(NeExprNode *node, const WalkItem &wi, WalkItem &wo);
+
+ void analyseEqExpr(EqExprNode *node, const WalkItem &wi, WalkItem &wo);
+
+ void analyseTruthOrIfExpr(TruthOrIfExprNode *node, const WalkItem &wi, WalkItem &wo);
}
#endif // ANALYSIS_EXPRESSION_H