diff options
-rw-r--r-- | src/analysis/analysis.cpp | 8 | ||||
-rw-r--r-- | src/analysis/expression.cpp | 32 | ||||
-rw-r--r-- | src/analysis/expression.h | 6 |
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 |