summaryrefslogtreecommitdiff
path: root/src/analysis
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-06-10 16:49:44 +0300
committerAndrei Karas <akaras@inbox.ru>2015-06-10 16:54:47 +0300
commit77fd4910981d22cb1364c134454bf640e885c81b (patch)
tree454d92b888e6a6d3c9b033b1647cf3a7f24c80f6 /src/analysis
parent5e6638be7db63eb932048b310bd1bd0d0ba96366 (diff)
downloadparanucker-77fd4910981d22cb1364c134454bf640e885c81b.tar.gz
paranucker-77fd4910981d22cb1364c134454bf640e885c81b.tar.bz2
paranucker-77fd4910981d22cb1364c134454bf640e885c81b.tar.xz
paranucker-77fd4910981d22cb1364c134454bf640e885c81b.zip
Add basic analysis for IF_STMT.
Diffstat (limited to 'src/analysis')
-rw-r--r--src/analysis/analysis.cpp12
-rw-r--r--src/analysis/statement.cpp82
-rw-r--r--src/analysis/statement.h33
3 files changed, 127 insertions, 0 deletions
diff --git a/src/analysis/analysis.cpp b/src/analysis/analysis.cpp
index f64c5c1..18120b8 100644
--- a/src/analysis/analysis.cpp
+++ b/src/analysis/analysis.cpp
@@ -25,6 +25,7 @@
#include "analysis/declaration.h"
#include "analysis/expression.h"
#include "analysis/function.h"
+#include "analysis/statement.h"
#include "analysis/walkitem.h"
#include "nodes/decl/function_decl.h"
@@ -34,6 +35,8 @@
#include "nodes/expr/modify_expr.h"
#include "nodes/expr/pointerplus_expr.h"
+#include "nodes/stmt/if_stmt.h"
+
#include "localconsts.h"
namespace Analysis
@@ -46,7 +49,11 @@ void startWalkTree(Node *node)
void walkTree(Node *node, WalkItem wi)
{
+ if (!node)
+ return;
+
wi = analyseNode(node, wi);
+
if (wi.stopWalking)
return;
@@ -69,6 +76,9 @@ int findBackLocation(Node *node)
WalkItem analyseNode(Node *node, WalkItem wi)
{
+ if (!node)
+ return wi;
+
// searching function declaration
switch (node->nodeType)
{
@@ -82,6 +92,8 @@ WalkItem analyseNode(Node *node, WalkItem wi)
return analysePointerPlusExpr(static_cast<PointerPlusExprNode*>(node), wi);
case VAR_DECL:
return analyseVarDecl(static_cast<VarDeclNode*>(node), wi);
+ case IF_STMT:
+ return analyseIfStmt(static_cast<IfStmtNode*>(node), wi);
default:
break;
}
diff --git a/src/analysis/statement.cpp b/src/analysis/statement.cpp
new file mode 100644
index 0000000..50c870a
--- /dev/null
+++ b/src/analysis/statement.cpp
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2015 Andrei Karas
+ *
+ * This file is part of AstDumper.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "analysis/statement.h"
+
+#include "command.h"
+#include "logger.h"
+
+#include "analysis/analysis.h"
+#include "analysis/walkitem.h"
+
+#include "nodes/expr/eq_expr.h"
+#include "nodes/expr/indirect_ref.h"
+#include "nodes/expr/modify_expr.h"
+#include "nodes/expr/pointerplus_expr.h"
+
+#include "nodes/stmt/if_stmt.h"
+
+#include <set>
+
+#include "localconsts.h"
+
+namespace Analysis
+{
+
+WalkItem analyseIfStmt(IfStmtNode *node, WalkItem wi)
+{
+ // need condition node
+ if (!node->condition || command == FindArgs)
+ return wi;
+
+ if (node->condition->nodeType == EQ_EXPR)
+ {
+ EqExprNode *eq = static_cast<EqExprNode*>(node->condition);
+ // need atleast two operands for EQ_EXPR node
+ if (eq->args.size() < 2)
+ return wi;
+
+ // PARM_DECL?
+ Node *node1 = eq->args[0];
+ // INTEGER_CST?
+ Node *node2 = eq->args[1];
+ // if (var == const)
+ if (node1->nodeType == PARM_DECL &&
+ node2->nodeType == INTEGER_CST &&
+ wi.checkNullVars.find(node1->label) != wi.checkNullVars.end() &&
+ node2->label == "0")
+ {
+ // found check for parameter and 0.
+ // walking to then branch
+ walkTree(node->thenNode, wi);
+ // From else branch remove variable what we just found.
+ wi.checkNullVars.erase(node1->label);
+ walkTree(node->elseNode, wi);
+ wi.stopWalking = true;
+
+ // need aslo on parent remove variable too
+ // probably wi should have pointer to parent
+ return wi;
+ }
+ }
+
+ return wi;
+}
+
+}
diff --git a/src/analysis/statement.h b/src/analysis/statement.h
new file mode 100644
index 0000000..5672e7f
--- /dev/null
+++ b/src/analysis/statement.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2015 Andrei Karas
+ *
+ * This file is part of AstDumper.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef ANALYSIS_STATEMENT_H
+#define ANALYSIS_STATEMENT_H
+
+#include "includes.h"
+
+struct IfStmtNode;
+struct WalkItem;
+
+namespace Analysis
+{
+ WalkItem analyseIfStmt(IfStmtNode *node, WalkItem wi);
+}
+
+#endif // ANALYSIS_STATEMENT_H