summaryrefslogtreecommitdiff
path: root/src/analysis/expression.cpp
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-07-10 21:53:03 +0300
committerAndrei Karas <akaras@inbox.ru>2015-07-10 21:53:03 +0300
commit11aec81a67f885955cd47d633e1940e144db4433 (patch)
tree09d5a5a43f530937180b9a136b99f9e01e78d996 /src/analysis/expression.cpp
parent45700a08edd0aa34dff01a40ee155a5145fa57f1 (diff)
downloadparanucker-11aec81a67f885955cd47d633e1940e144db4433.tar.gz
paranucker-11aec81a67f885955cd47d633e1940e144db4433.tar.bz2
paranucker-11aec81a67f885955cd47d633e1940e144db4433.tar.xz
paranucker-11aec81a67f885955cd47d633e1940e144db4433.zip
Fix false positive like this: ptr = ptr->val;
Diffstat (limited to 'src/analysis/expression.cpp')
-rw-r--r--src/analysis/expression.cpp13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp
index 683623a..54d73c2 100644
--- a/src/analysis/expression.cpp
+++ b/src/analysis/expression.cpp
@@ -152,20 +152,25 @@ void analyseModifyExpr(ModifyExprNode *node, const WalkItem &wi, WalkItem &wo)
if (arg == INDIRECT_REF)
{
// var2 not found in known checking pointer
+ reportParmDeclNullPointer(node,
+ static_cast<IndirectRefNode*>(arg)->ref,
+ wi);
+
if (isNotIn(var2, wi.needCheckNullVars) &&
isNotIn(var2, wi.knownVars))
{
removeVar(wo, var1);
}
-
- reportParmDeclNullPointer(node,
- static_cast<IndirectRefNode*>(arg)->ref,
- wi);
}
else if (!var1.empty())
{
if (var2.empty())
{ // have var1 only (var1 = UNKNOWN or var1 = function(...))
+
+ walkTree(arg, wi, wo);
+ walkTree(node->args[1], wi, wo);
+ wo.stopWalking = true;
+
bool handled(false);
if (node->args[1] == CALL_EXPR && isPointerArg(arg))
{