From 3a7fc8e3bf44b97fc584a295ead0534900851b0b Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Thu, 7 Mar 2019 22:28:25 +0300 Subject: Add GOTO_EXPR Some uncommited old changes... --- src/analysis/analysis.cpp | 4 ++++ src/analysis/expression.cpp | 14 ++++++++++++-- src/analysis/expression.h | 7 +++++++ src/analysis/ref.cpp | 18 +++++++++++++++++- 4 files changed, 40 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/analysis/analysis.cpp b/src/analysis/analysis.cpp index 8b76a6e..fe0bc7e 100644 --- a/src/analysis/analysis.cpp +++ b/src/analysis/analysis.cpp @@ -42,6 +42,7 @@ #include "nodes/expr/cond_expr.h" #include "nodes/expr/decl_expr.h" #include "nodes/expr/eq_expr.h" +#include "nodes/expr/goto_expr.h" #include "nodes/expr/init_expr.h" #include "nodes/expr/modify_expr.h" #include "nodes/expr/ne_expr.h" @@ -257,6 +258,9 @@ void analyseNode(Node *node, const WalkItem &wi, WalkItem &wo) case COMPOUND_EXPR: analyseCompoundExpr(static_cast(node), wi2, wo); break; + case GOTO_EXPR: + analyseGotoExpr(static_cast(node), wi2, wo); + break; case NOP_EXPR: analyseNopExpr(static_cast(node), wi2, wo); break; diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp index 4dd85bd..578dc8e 100644 --- a/src/analysis/expression.cpp +++ b/src/analysis/expression.cpp @@ -41,6 +41,7 @@ #include "nodes/expr/convert_expr.h" #include "nodes/expr/decl_expr.h" #include "nodes/expr/eq_expr.h" +#include "nodes/expr/goto_expr.h" #include "nodes/expr/init_expr.h" #include "nodes/expr/modify_expr.h" #include "nodes/expr/ne_expr.h" @@ -681,6 +682,8 @@ void analyseOrCondition(Node *node, Node *node1, Node *node2, const WalkItem &wi wo1.checkedElseNonNullVars.end()); wi2.knownVars.insert(wo1.checkedElseNullVars.begin(), wo1.checkedElseNullVars.end()); +// FOR_EACH(it, wi2.knownNonNullVars) +// Log::log("known non null: %s\n", it.c_str()); Log::dumpWI(node, "wi2 ", wi2); walkTree(node2, wi2, wo2); Log::dumpWI(node, "wo2 ", wo2); @@ -980,7 +983,7 @@ void analyseCallExpr(CallExprNode *node, const WalkItem &wi, WalkItem &wo) } } VarItem var = getVariableName(function); - if (!var.isNonNull) + if (!var.isNonNull && isNotIn(var.name, wo2.knownNonNullVars)) reportParmDeclNullPointer(node, function, wi); if (!getVariableName(function).empty()) enableCheck = false; @@ -1001,7 +1004,7 @@ void analyseCallExpr(CallExprNode *node, const WalkItem &wi, WalkItem &wo) VarItem var = getVariableName(node2); if (enableCheck) { - if (!var.isNonNull) + if (!var.isNonNull && isNotIn(var.name, wo2.knownNonNullVars)) reportParmDeclNullPointer(node, node2, wi); enableCheck = false; } @@ -1272,4 +1275,11 @@ void analyseInitExpr(InitExprNode* node, reportParmDeclLeftNullPointer(node, node->args[1], wi); } +void analyseGotoExpr(GotoExprNode *node, + const WalkItem &wi, + WalkItem &wo) +{ + wo.isContinued = true; +} + } diff --git a/src/analysis/expression.h b/src/analysis/expression.h index 8d18a95..41def20 100644 --- a/src/analysis/expression.h +++ b/src/analysis/expression.h @@ -30,6 +30,7 @@ struct CompoundExprNode; struct CondExprNode; struct DeclExprNode; struct EqExprNode; +struct GotoExprNode; struct InitExprNode; struct ModifyExprNode; struct NeExprNode; @@ -87,6 +88,10 @@ namespace Analysis void analyseInitExpr(InitExprNode* node, const WalkItem &wi, WalkItem &wo); + void analyseGotoExpr(GotoExprNode *node, + const WalkItem &wi, + WalkItem &wo); + void handleSetVar(Node *node1, Node *node2, const WalkItem &wi, @@ -108,6 +113,8 @@ namespace Analysis WalkItem &wo); bool isValidVar(const VarItem &str); + + VarItem getVariableName(Node *node); } #endif // ANALYSIS_EXPRESSION_H diff --git a/src/analysis/ref.cpp b/src/analysis/ref.cpp index 2391fa3..f2fcb21 100644 --- a/src/analysis/ref.cpp +++ b/src/analysis/ref.cpp @@ -24,6 +24,7 @@ #include "analysis/analysis.h" #include "analysis/reports.h" +#include "analysis/varitem.h" #include "analysis/walkitem.h" #include "nodes/expr/addr_expr.h" @@ -68,10 +69,25 @@ void analyseArrayRef(ArrayRefNode *node, if (node->args.empty() || checkCommand(FindArgs)) return; +// if (isIn("cell", wi.knownNonNullVars)) +// Log::log("cell ok1\n"); +// else +// Log::log("cell not ok1\n"); + +// Log::log("array start\n"); FOR_EACH(it, node->args) { - reportParmDeclNullPointer(node, it, wi); + VarItem var = getVariableName(it); + if (!var.isNonNull && isNotIn(var.name, wo.knownNonNullVars)) + reportParmDeclNullPointer(node, it, wi); } + +// if (isIn("cell", wi.knownNonNullVars)) +// Log::log("cell ok1\n"); +// else +// Log::log("cell not ok1\n"); + +// Log::log("array end\n"); } } -- cgit v1.2.3-70-g09d2