summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-08-17 22:13:43 +0300
committerAndrei Karas <akaras@inbox.ru>2015-08-17 22:23:12 +0300
commit231d34905f2a24faff79f6ed805ef89f17caf96b (patch)
tree5dbcb9c4257b1086ab81035c959326b26ec0d6f0
parent403ac1b947e323853b0dbe8b3220c320f0f5ff83 (diff)
downloadparanucker-231d34905f2a24faff79f6ed805ef89f17caf96b.tar.gz
paranucker-231d34905f2a24faff79f6ed805ef89f17caf96b.tar.bz2
paranucker-231d34905f2a24faff79f6ed805ef89f17caf96b.tar.xz
paranucker-231d34905f2a24faff79f6ed805ef89f17caf96b.zip
Fix false positives like this: var = &expr;
-rw-r--r--src/analysis/expression.cpp12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp
index 7b2b897..509faa0 100644
--- a/src/analysis/expression.cpp
+++ b/src/analysis/expression.cpp
@@ -1078,12 +1078,22 @@ bool handleSetVarToFunction(const VarItem &var,
if (node2 == ADDR_EXPR)
{
+ if (node1 == VAR_DECL)
+ {
+ // var = &expr;
+ VarDeclNode *varDecl = static_cast<VarDeclNode*>(node1);
+ if (skipNop(varDecl->varType) == POINTER_TYPE)
+ {
+ addNonNullVar(wo, var.name);
+ return true;
+ }
+ }
AddrExprNode *addr = static_cast<AddrExprNode*>(node2);
if (!addr->args.empty() && skipNop(addr->args[0]) == VAR_DECL)
{
- VarDeclNode *varDecl = static_cast<VarDeclNode*>(skipNop(addr->args[0]));
if (!var.isNonNull)
{
+ VarDeclNode *varDecl = static_cast<VarDeclNode*>(skipNop(addr->args[0]));
if (skipNop(varDecl->varType) != POINTER_TYPE)
addNonNullVar(wo, var.name);
else