From 77fd4910981d22cb1364c134454bf640e885c81b Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Wed, 10 Jun 2015 16:49:44 +0300 Subject: Add basic analysis for IF_STMT. --- src/analysis/analysis.cpp | 12 +++++++ src/analysis/statement.cpp | 82 ++++++++++++++++++++++++++++++++++++++++++++++ src/analysis/statement.h | 33 +++++++++++++++++++ 3 files changed, 127 insertions(+) create mode 100644 src/analysis/statement.cpp create mode 100644 src/analysis/statement.h (limited to 'src/analysis') 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(node), wi); case VAR_DECL: return analyseVarDecl(static_cast(node), wi); + case IF_STMT: + return analyseIfStmt(static_cast(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 . + */ + +#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 + +#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(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 . + */ + +#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 -- cgit v1.2.3-60-g2f50