summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-06-30 23:40:41 +0300
committerAndrei Karas <akaras@inbox.ru>2015-06-30 23:40:41 +0300
commit3a0c428fc8373381077b9c316cd8939b2560591b (patch)
tree988f71f69c16cb453a57857d8efe781f1e698747
parent7feb97f26f549181e44dc13e40b21eb3aff54ef3 (diff)
downloadparanucker-3a0c428fc8373381077b9c316cd8939b2560591b.tar.gz
paranucker-3a0c428fc8373381077b9c316cd8939b2560591b.tar.bz2
paranucker-3a0c428fc8373381077b9c316cd8939b2560591b.tar.xz
paranucker-3a0c428fc8373381077b9c316cd8939b2560591b.zip
Into walkitem add set knownNonNullVars.
-rw-r--r--src/analysis/analysis.cpp2
-rw-r--r--src/analysis/expression.cpp10
-rw-r--r--src/analysis/statement.cpp8
-rw-r--r--src/analysis/walkitem.h5
4 files changed, 18 insertions, 7 deletions
diff --git a/src/analysis/analysis.cpp b/src/analysis/analysis.cpp
index 1fcf211..c321fbe 100644
--- a/src/analysis/analysis.cpp
+++ b/src/analysis/analysis.cpp
@@ -182,6 +182,8 @@ void walkTree(Node *node, const WalkItem &wi, WalkItem &wo)
addNeedCheckNullVars(wi2, wi2);
wo2.needCheckNullVars = wi2.needCheckNullVars;
wo2.knownVars = wi2.knownVars;
+ wo2.knownNullVars = wi2.knownNullVars;
+ wo2.knownNonNullVars = wi2.knownNonNullVars;
wi2.isReturned = wi2.isReturned || wo2.isReturned;
wi2.linkedVars = wo2.linkedVars;
wi2.linkedReverseVars = wo2.linkedReverseVars;
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp
index fa14172..1d05aa8 100644
--- a/src/analysis/expression.cpp
+++ b/src/analysis/expression.cpp
@@ -215,7 +215,7 @@ void analyseNeExpr(NeExprNode *node, const WalkItem &wi, WalkItem &wo)
wo.uselessExpr = false;
return;
}
- else if (wi.knownVars.find(var) != wi.knownVars.end())
+ else if (wi.knownNonNullVars.find(var) != wi.knownNonNullVars.end())
{
bool doReport(true);
// exception for delete operator. it check for var != 0 before really delete
@@ -347,8 +347,10 @@ void analyseOrCondition(Node *node, Node *node1, Node *node2, const WalkItem &wi
removeNeedCheckNullVarsSet(wi2, wo1.checkedNullVars);
wi2.needCheckNullVars.insert(wo1.checkedNonNullVars.begin(),
wo1.checkedNonNullVars.end());
- wi2.knownVars.insert(wo1.checkedNonNullVars.begin(),
+ wi2.knownNonNullVars.insert(wo1.checkedNonNullVars.begin(),
wo1.checkedNonNullVars.end());
+ wi2.knownNullVars.insert(wo1.checkedNullVars.begin(),
+ wo1.checkedNullVars.end());
Log::dumpWI(node, "wi2 ", wi2);
walkTree(node2, wi2, wo2);
Log::dumpWI(node, "wo2 ", wo2);
@@ -376,8 +378,10 @@ void analyseAndCondition(Node *node, Node *node1, Node *node2, const WalkItem &w
removeNeedCheckNullVarsSet(wi2, wo1.checkedNonNullVars);
wi2.needCheckNullVars.insert(wo1.checkedNullVars.begin(),
wo1.checkedNullVars.end());
- wi2.knownVars.insert(wo1.checkedNullVars.begin(),
+ wi2.knownNullVars.insert(wo1.checkedNullVars.begin(),
wo1.checkedNullVars.end());
+ wi2.knownNonNullVars.insert(wo1.checkedNonNullVars.begin(),
+ wo1.checkedNonNullVars.end());
Log::dumpWI(node, "wi2 ", wi2);
walkTree(node2, wi2, wo2);
Log::dumpWI(node, "wo2 ", wo2);
diff --git a/src/analysis/statement.cpp b/src/analysis/statement.cpp
index 1c2ece3..da90082 100644
--- a/src/analysis/statement.cpp
+++ b/src/analysis/statement.cpp
@@ -63,8 +63,8 @@ void analyseCondition(Node *node,
removeNeedCheckNullVarsSet(wi2, wco.checkedNonNullVars);
wi2.needCheckNullVars.insert(wco.checkedNullVars.begin(),
wco.checkedNullVars.end());
- wi2.knownVars.insert(wco.checkedNullVars.begin(),
- wco.checkedNullVars.end());
+ wi2.knownNonNullVars.insert(wco.checkedNonNullVars.begin(),
+ wco.checkedNonNullVars.end());
wi2.knownNullVars.insert(wco.checkedNullVars.begin(),
wco.checkedNullVars.end());
Log::dumpWI(node, "wi2 then ", wi2);
@@ -79,8 +79,10 @@ void analyseCondition(Node *node,
removeNeedCheckNullVarsSet(wi3, wco.checkedNullVars);
wi3.needCheckNullVars.insert(wco.checkedNonNullVars.begin(),
wco.checkedNonNullVars.end());
- wi3.knownVars.insert(wco.checkedNonNullVars.begin(),
+ wi3.knownNullVars.insert(wco.checkedNonNullVars.begin(),
wco.checkedNonNullVars.end());
+ wi3.knownNonNullVars.insert(wco.checkedNullVars.begin(),
+ wco.checkedNullVars.end());
Log::dumpWI(node, "wi3 else ", wi3);
reportParmDeclNullPointer(node,
diff --git a/src/analysis/walkitem.h b/src/analysis/walkitem.h
index 145c4e1..b8bc202 100644
--- a/src/analysis/walkitem.h
+++ b/src/analysis/walkitem.h
@@ -34,6 +34,7 @@ struct WalkItem
needCheckNullVars(),
knownVars(),
knownNullVars(),
+ knownNonNullVars(),
removeNullVars(),
addNullVars(),
checkedNullVars(),
@@ -51,6 +52,7 @@ struct WalkItem
needCheckNullVars(item.needCheckNullVars),
knownVars(item.knownVars),
knownNullVars(item.knownNullVars),
+ knownNonNullVars(item.knownNonNullVars),
removeNullVars(item.removeNullVars),
addNullVars(item.addNullVars),
checkedNullVars(item.checkedNullVars),
@@ -65,8 +67,9 @@ struct WalkItem
}
StringSet needCheckNullVars; // need check for usage without null pointer check
- StringSet knownVars; // vars already checked for null pointer
+ StringSet knownVars; // known vars what can be checked or already checked
StringSet knownNullVars; // vars checked and it null
+ StringSet knownNonNullVars; // vars checked for null pointer
StringSet removeNullVars; // need remove vars from parent checkNullVars
StringSet addNullVars; // need add vars to parent checkNullVars
StringSet checkedNullVars; // vars checked for null in expressions