summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-07-23 15:52:10 +0300
committerAndrei Karas <akaras@inbox.ru>2015-07-23 15:52:10 +0300
commit57adc4b80c716565bdc6403e4823260e9f876e86 (patch)
tree20052e8b35cbb8ca4d28b8fb931edb56c8b755fd /src
parentd6989382bcfae2c2d822cfc3ea7bebfeef77d5e6 (diff)
downloadparanucker-57adc4b80c716565bdc6403e4823260e9f876e86.tar.gz
paranucker-57adc4b80c716565bdc6403e4823260e9f876e86.tar.bz2
paranucker-57adc4b80c716565bdc6403e4823260e9f876e86.tar.xz
paranucker-57adc4b80c716565bdc6403e4823260e9f876e86.zip
Check all variables before using for pointer type.
Diffstat (limited to 'src')
-rw-r--r--src/analysis/expression.cpp36
1 files changed, 35 insertions, 1 deletions
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp
index 7370a57..dbf56c4 100644
--- a/src/analysis/expression.cpp
+++ b/src/analysis/expression.cpp
@@ -80,10 +80,24 @@ std::string getVariableName(Node *node)
if (!node)
return "";
- if (node == PARM_DECL || node == VAR_DECL)
+ if (node == PARM_DECL)
+ {
+ ParmDeclNode *decl = static_cast<ParmDeclNode*>(node);
+ if (skipNop(decl->declType) != POINTER_TYPE)
+ return "";
return node->label;
+ }
+ if (node == VAR_DECL)
+ {
+ VarDeclNode *var = static_cast<VarDeclNode*>(node);
+ if (skipNop(var->varType) != POINTER_TYPE)
+ return "";
+ return node->label;
+ }
else if (node == COMPONENT_REF)
+ {
return getComponentRefVariable(node);
+ }
return "";
}
@@ -133,6 +147,18 @@ std::string getComponentRefVariable(Node *node)
return str;
IndirectRefNode *indirect = static_cast<IndirectRefNode*>(object);
Node *ref = skipNop(indirect->ref);
+ if (ref == PARM_DECL)
+ {
+ ParmDeclNode *decl = static_cast<ParmDeclNode*>(ref);
+ if (skipNop(decl->declType) != POINTER_TYPE)
+ return str;
+ }
+ if (ref == VAR_DECL)
+ {
+ VarDeclNode *varDecl = static_cast<VarDeclNode*>(ref);
+ if (varDecl->varType != POINTER_TYPE)
+ return str;
+ }
if (ref == PARM_DECL || ref == VAR_DECL)
{
str.append(ref->label).append("->").append(field->label);
@@ -355,10 +381,12 @@ void analyseNeExpr(NeExprNode *node, const WalkItem &wi, WalkItem &wo)
node2->label == "0")
{
if (isIn(var, wi.needCheckNullVars))
+// isNotIn(var, wi.knownVars))
{
wo.checkedThenNonNullVars.insert(var);
wo.checkedElseNullVars.insert(var);
wo.knownNonNullVars.insert(var);
+ //wo.knownVars.insert(var);
wo.cleanExpr = true;
wo.uselessExpr = false;
return;
@@ -678,15 +706,21 @@ void analyseBindExpr(BindExprNode *node, const WalkItem &wi, WalkItem &wo)
return;
WalkItem wi2 = wi;
+// Log::log("start args 1\n");
walkTree(node->args[1], wi2, wo);
+// Log::log("end args 1\n");
wi2 = wo;
Log::dumpWI(node, "wi2 ", wi2);
+// Log::log("start args 0\n");
walkTree(node->args[0], wi2, wo);
+// Log::log("end args 0\n");
if (sz > 2)
{
wi2 = wo;
Log::dumpWI(node, "wi2 ", wi2);
+// Log::log("start args 2\n");
walkTree(node->args[2], wi2, wo);
+// Log::log("end args 2\n");
}
handleSetVarDecl(node->args[0], wi2, wo);