summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-08-18 20:02:09 +0300
committerAndrei Karas <akaras@inbox.ru>2015-08-18 20:02:09 +0300
commit6c3cccceff2c479e61037fbbb4fc31bcb7bfa3d5 (patch)
tree2b34fa03597bc7899e78813cf4518dbd0671415b
parent5c14089e2997c63e0e37aa7024abdc4db3eb89e3 (diff)
downloadparanucker-6c3cccceff2c479e61037fbbb4fc31bcb7bfa3d5.tar.gz
paranucker-6c3cccceff2c479e61037fbbb4fc31bcb7bfa3d5.tar.bz2
paranucker-6c3cccceff2c479e61037fbbb4fc31bcb7bfa3d5.tar.xz
paranucker-6c3cccceff2c479e61037fbbb4fc31bcb7bfa3d5.zip
Fix some false positives in experession like this: var = new type();
-rw-r--r--src/analysis/expression.cpp43
1 files changed, 38 insertions, 5 deletions
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp
index edd1615..3d4b974 100644
--- a/src/analysis/expression.cpp
+++ b/src/analysis/expression.cpp
@@ -32,6 +32,7 @@
#include "analysis/walkitem.h"
#include "nodes/expr/addr_expr.h"
+#include "nodes/expr/aggrinit_expr.h"
#include "nodes/expr/bind_expr.h"
#include "nodes/expr/call_expr.h"
#include "nodes/expr/cleanuppoint_expr.h"
@@ -1073,6 +1074,10 @@ bool handleSetVarToFunction(const VarItem &var,
Node *node2,
WalkItem &wo)
{
+ //if (node1)
+ // Log::log("node1=%s\n", node1->nodeTypeName.c_str());
+ //if (node2)
+ // Log::log("node2=%s\n", node2->nodeTypeName.c_str());
if (var.isNonNull)
return false;
node1 = skipNop(node1);
@@ -1149,14 +1154,39 @@ bool handleSetVarToFunction(const VarItem &var,
node2 = comp->args[0];
}
- if (node2 != CALL_EXPR)
+ if (skipNop(node2) == INIT_EXPR)
+ {
+ InitExprNode *init = static_cast<InitExprNode*>(skipNop(node2));
+ if (!init || init->args.size() < 2)
+ return handleSetVarToFunctionBack(var, node2, wo);
+ node2 = init->args[1];
+ }
+ node2 = skipNop(node2);
+ if (node2 == CONSTRUCTOR)
+ {
+ addNonNullVar(wo, var.name);
+ return true;
+ }
+ if (node2 != CALL_EXPR && node2 != AGGR_INIT_EXPR)
return handleSetVarToFunctionBack(var, node2, wo);
}
- CallExprNode *call = static_cast<CallExprNode*>(node2);
- if (!call || skipNop(call->function) != ADDR_EXPR)
- return handleSetVarToFunctionBack(var, node2, wo);
- AddrExprNode *addr = static_cast<AddrExprNode*>(skipNop(call->function));
+ AddrExprNode *addr = nullptr;
+ if (node2 == CALL_EXPR)
+ {
+ CallExprNode *call = static_cast<CallExprNode*>(node2);
+ if (!call || skipNop(call->function) != ADDR_EXPR)
+ return handleSetVarToFunctionBack(var, node2, wo);
+ addr = static_cast<AddrExprNode*>(skipNop(call->function));
+ }
+ else if (node2 == AGGR_INIT_EXPR)
+ {
+ AggrInitExprNode *aggr = static_cast<AggrInitExprNode*>(node2);
+ if (skipNop(aggr->function) != ADDR_EXPR)
+ return handleSetVarToFunctionBack(var, node2, wo);
+ addr = static_cast<AddrExprNode*>(skipNop(aggr->function));
+ }
+
if (!addr ||
addr->args.empty() ||
skipNop(addr->args[0]) != FUNCTION_DECL)
@@ -1182,6 +1212,7 @@ bool handleSetVarToFunction(const VarItem &var,
return false;
}
+ //Log::log("func->label='%s'\n", func->label.c_str());
if (findTreeListPurpose(static_cast<TreeListNode*>(func->functionType->attribute),
"returns_nonnull") ||
func->label == "operator new" ||
@@ -1189,10 +1220,12 @@ bool handleSetVarToFunction(const VarItem &var,
func->label == "__comp_ctor ")
{ // function have attribute returns_nonnull. This mean result cant be null
addNonNullVar(wo, var.name);
+ //Log::log("add non null var: %s\n", var.name.c_str());
}
else
{ // function not have attribute returns_nonnull. This mean result can be null
addUnknownVar(wo, var.name);
+ //Log::log("add unknown var: %s\n", var.name.c_str());
}
return true;
}