summaryrefslogtreecommitdiff
path: root/src/analysis/expression.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/expression.cpp')
-rw-r--r--src/analysis/expression.cpp14
1 files changed, 12 insertions, 2 deletions
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;
+}
+
}