From dee5cf7bc6a5e1ffc813c81caac1f711b9d6093e Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sun, 28 Jun 2015 12:41:07 +0300 Subject: Add knownVars field to walkitem. --- src/analysis/analysis.cpp | 2 ++ src/analysis/expression.cpp | 4 ++++ src/analysis/function.cpp | 1 + src/analysis/statement.cpp | 4 ++++ src/analysis/walkitem.h | 3 +++ src/logger.cpp | 1 + 6 files changed, 15 insertions(+) (limited to 'src') 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::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) -- cgit v1.2.3-60-g2f50