summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-07-23 17:02:19 +0300
committerAndrei Karas <akaras@inbox.ru>2015-07-23 17:02:19 +0300
commit1758b24586ca856479ebc33b6c77955744e96034 (patch)
tree92352201c22529ad51b99ea7e9f24697e7b10d16 /src
parentf454b761bf96d2d2fc877eefdd13aa5c1b713753 (diff)
downloadparanucker-1758b24586ca856479ebc33b6c77955744e96034.tar.gz
paranucker-1758b24586ca856479ebc33b6c77955744e96034.tar.bz2
paranucker-1758b24586ca856479ebc33b6c77955744e96034.tar.xz
paranucker-1758b24586ca856479ebc33b6c77955744e96034.zip
Dont check variable type on PARM_DECL also add unknown vars to known.
Not checking PARM_DECL may add issues like any non pointer parameters can be added to known vars collection.
Diffstat (limited to 'src')
-rw-r--r--src/analysis/expression.cpp30
1 files changed, 22 insertions, 8 deletions
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp
index dbf56c4..3376d81 100644
--- a/src/analysis/expression.cpp
+++ b/src/analysis/expression.cpp
@@ -83,8 +83,11 @@ std::string getVariableName(Node *node)
if (node == PARM_DECL)
{
ParmDeclNode *decl = static_cast<ParmDeclNode*>(node);
- if (skipNop(decl->declType) != POINTER_TYPE)
+ if (skipNop(decl->declType) != nullptr &&
+ skipNop(decl->declType) != POINTER_TYPE)
+ {
return "";
+ }
return node->label;
}
if (node == VAR_DECL)
@@ -112,8 +115,11 @@ bool isPointerArg(Node *node)
if (node == PARM_DECL)
{
ParmDeclNode *decl = static_cast<ParmDeclNode*>(node);
- if (skipNop(decl->declType) == POINTER_TYPE)
+ if (skipNop(decl->declType) == nullptr ||
+ skipNop(decl->declType) == POINTER_TYPE)
+ {
return true;
+ }
}
else if (node == VAR_DECL)
{
@@ -150,8 +156,11 @@ std::string getComponentRefVariable(Node *node)
if (ref == PARM_DECL)
{
ParmDeclNode *decl = static_cast<ParmDeclNode*>(ref);
- if (skipNop(decl->declType) != POINTER_TYPE)
+ if (skipNop(decl->declType) != nullptr &&
+ skipNop(decl->declType) != POINTER_TYPE)
+ {
return str;
+ }
}
if (ref == VAR_DECL)
{
@@ -187,8 +196,11 @@ std::vector<std::string> getComponentRefParts(Node *node)
if (ref == PARM_DECL)
{
ParmDeclNode *parmDecl = static_cast<ParmDeclNode*>(ref);
- if (parmDecl->declType == POINTER_TYPE)
+ if (skipNop(parmDecl->declType) == nullptr ||
+ skipNop(parmDecl->declType) == POINTER_TYPE)
+ {
str.push_back(ref->label);
+ }
}
if (ref == VAR_DECL)
{
@@ -380,13 +392,13 @@ void analyseNeExpr(NeExprNode *node, const WalkItem &wi, WalkItem &wo)
node2 == INTEGER_CST &&
node2->label == "0")
{
- if (isIn(var, wi.needCheckNullVars))
-// isNotIn(var, wi.knownVars))
+ 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.knownVars.insert(var);
wo.cleanExpr = true;
wo.uselessExpr = false;
return;
@@ -498,11 +510,13 @@ void analyseEqExpr(EqExprNode *node, const WalkItem &wi, WalkItem &wo)
node2 == INTEGER_CST &&
node2->label == "0")
{
- if (isIn(var, wi.needCheckNullVars))
+ if (isIn(var, wi.needCheckNullVars) ||
+ isNotIn(var, wi.knownVars))
{
wo.checkedThenNullVars.insert(var);
wo.checkedElseNonNullVars.insert(var);
wo.knownNullVars.insert(var);
+ wo.knownVars.insert(var);
wo.cleanExpr = true;
wo.uselessExpr = false;
if (isIn(var, wi.knownNullVars) ||