summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/analysis/analysis.cpp4
-rw-r--r--src/analysis/expression.cpp14
-rw-r--r--src/analysis/expression.h7
-rw-r--r--src/analysis/ref.cpp18
4 files changed, 40 insertions, 3 deletions
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<CompoundExprNode*>(node), wi2, wo);
break;
+ case GOTO_EXPR:
+ analyseGotoExpr(static_cast<GotoExprNode*>(node), wi2, wo);
+ break;
case NOP_EXPR:
analyseNopExpr(static_cast<NopExprNode*>(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");
}
}