diff options
-rw-r--r-- | src/analysis/analysis.cpp | 2 | ||||
-rw-r--r-- | src/analysis/expression.cpp | 10 | ||||
-rw-r--r-- | src/analysis/statement.cpp | 8 | ||||
-rw-r--r-- | src/analysis/walkitem.h | 5 |
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 |