summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-06-28 12:41:07 +0300
committerAndrei Karas <akaras@inbox.ru>2015-06-28 12:41:07 +0300
commitdee5cf7bc6a5e1ffc813c81caac1f711b9d6093e (patch)
treec30fe0244e9e267e2d2e6b03e29f84596903d156 /src
parentdffa2b1075230bcf198c80fc685b61332f07d9c7 (diff)
downloadparanucker-dee5cf7bc6a5e1ffc813c81caac1f711b9d6093e.tar.gz
paranucker-dee5cf7bc6a5e1ffc813c81caac1f711b9d6093e.tar.bz2
paranucker-dee5cf7bc6a5e1ffc813c81caac1f711b9d6093e.tar.xz
paranucker-dee5cf7bc6a5e1ffc813c81caac1f711b9d6093e.zip
Add knownVars field to walkitem.
Diffstat (limited to 'src')
-rw-r--r--src/analysis/analysis.cpp2
-rw-r--r--src/analysis/expression.cpp4
-rw-r--r--src/analysis/function.cpp1
-rw-r--r--src/analysis/statement.cpp4
-rw-r--r--src/analysis/walkitem.h3
-rw-r--r--src/logger.cpp1
6 files changed, 15 insertions, 0 deletions
diff --git a/src/analysis/analysis.cpp b/src/analysis/analysis.cpp
index 80d34d4..bb6b93e 100644
--- a/src/analysis/analysis.cpp
+++ b/src/analysis/analysis.cpp
@@ -67,6 +67,7 @@ void addCheckNullVars(WalkItem &wi, WalkItem &wo)
FOR_EACH (std::set<std::string>::const_iterator, it, wi.addNullVars)
{
wo.checkNullVars.insert(*it);
+ wo.knownVars.insert(*it);
}
}
@@ -177,6 +178,7 @@ void walkTree(Node *node, const WalkItem &wi, WalkItem &wo)
wi2.addNullVars = wo2.addNullVars;
addCheckNullVars(wi2, wi2);
wo2.checkNullVars = wi2.checkNullVars;
+ wo2.knownVars = wi2.knownVars;
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 20bc821..e521615 100644
--- a/src/analysis/expression.cpp
+++ b/src/analysis/expression.cpp
@@ -245,6 +245,8 @@ void analyseOrCondition(Node *node, Node *node1, Node *node2, const WalkItem &wi
removeCheckNullVarsSet(wi2, wo1.checkedNullVars);
wi2.checkNullVars.insert(wo1.checkedNonNullVars.begin(),
wo1.checkedNonNullVars.end());
+ wi2.knownVars.insert(wo1.checkedNonNullVars.begin(),
+ wo1.checkedNonNullVars.end());
Log::dumpWI(node, "wi2 ", wi2);
walkTree(node2, wi2, wo2);
Log::dumpWI(node, "wo2 ", wo2);
@@ -272,6 +274,8 @@ void analyseAndCondition(Node *node, Node *node1, Node *node2, const WalkItem &w
removeCheckNullVarsSet(wi2, wo1.checkedNonNullVars);
wi2.checkNullVars.insert(wo1.checkedNullVars.begin(),
wo1.checkedNullVars.end());
+ wi2.knownVars.insert(wo1.checkedNullVars.begin(),
+ wo1.checkedNullVars.end());
Log::dumpWI(node, "wi2 ", wi2);
walkTree(node2, wi2, wo2);
Log::dumpWI(node, "wo2 ", wo2);
diff --git a/src/analysis/function.cpp b/src/analysis/function.cpp
index df6d733..6197e0a 100644
--- a/src/analysis/function.cpp
+++ b/src/analysis/function.cpp
@@ -126,6 +126,7 @@ void getPossibleNullParameters(FunctionDeclNode *node, WalkItem &wi)
name->label.c_str());
}
wi.checkNullVars.insert(name->label);
+ wi.knownVars.insert(name->label);
}
}
if (checkCommand(FindArgs))
diff --git a/src/analysis/statement.cpp b/src/analysis/statement.cpp
index 1bedd7f..08bb4db 100644
--- a/src/analysis/statement.cpp
+++ b/src/analysis/statement.cpp
@@ -63,6 +63,8 @@ void analyseCondition(Node *node,
removeCheckNullVarsSet(wi2, wco.checkedNonNullVars);
wi2.checkNullVars.insert(wco.checkedNullVars.begin(),
wco.checkedNullVars.end());
+ wi2.knownVars.insert(wco.checkedNullVars.begin(),
+ wco.checkedNullVars.end());
Log::dumpWI(node, "wi2 then ", wi2);
reportParmDeclNullPointer(node,
@@ -75,6 +77,8 @@ void analyseCondition(Node *node,
removeCheckNullVarsSet(wi3, wco.checkedNullVars);
wi3.checkNullVars.insert(wco.checkedNonNullVars.begin(),
wco.checkedNonNullVars.end());
+ wi3.knownVars.insert(wco.checkedNonNullVars.begin(),
+ wco.checkedNonNullVars.end());
Log::dumpWI(node, "wi3 else ", wi3);
reportParmDeclNullPointer(node,
diff --git a/src/analysis/walkitem.h b/src/analysis/walkitem.h
index 0b364e5..dc69151 100644
--- a/src/analysis/walkitem.h
+++ b/src/analysis/walkitem.h
@@ -32,6 +32,7 @@ struct WalkItem
{
WalkItem() :
checkNullVars(),
+ knownVars(),
removeNullVars(),
addNullVars(),
checkedNullVars(),
@@ -47,6 +48,7 @@ struct WalkItem
WalkItem(const WalkItem &item) :
checkNullVars(item.checkNullVars),
+ knownVars(item.knownVars),
removeNullVars(item.removeNullVars),
addNullVars(item.addNullVars),
checkedNullVars(item.checkedNullVars),
@@ -61,6 +63,7 @@ struct WalkItem
}
StringSet checkNullVars; // need check for usage without null pointer check
+ StringSet knownVars; // vars already 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
diff --git a/src/logger.cpp b/src/logger.cpp
index 2c2fa11..692c462 100644
--- a/src/logger.cpp
+++ b/src/logger.cpp
@@ -223,6 +223,7 @@ void dumpWI(Node *const node,
dumpWIProps(" checkedNullVars:", wi.checkedNullVars)
dumpWIProps(" checkedNonNullVars:", wi.checkedNonNullVars)
dumpWIProps(" checkNullVars:", wi.checkNullVars)
+ dumpWIProps(" knownVars:", wi.knownVars)
dumpWIProps(" removeNullVars:", wi.removeNullVars)
dumpWIProps(" addNullVars:", wi.addNullVars)