summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-08-06 17:07:48 +0300
committerAndrei Karas <akaras@inbox.ru>2015-08-06 17:07:48 +0300
commit55d9267b23914ee282b0b81c54a6ffd5f408da81 (patch)
tree0dc0bb11f1a2e4b5df15b078f182a562264aa7fa
parent9929a11dab3def2cfe821a682a60f8c35193277f (diff)
downloadparanucker-55d9267b23914ee282b0b81c54a6ffd5f408da81.tar.gz
paranucker-55d9267b23914ee282b0b81c54a6ffd5f408da81.tar.bz2
paranucker-55d9267b23914ee282b0b81c54a6ffd5f408da81.tar.xz
paranucker-55d9267b23914ee282b0b81c54a6ffd5f408da81.zip
Fix false positive in return statment.
-rw-r--r--src/analysis/statement.cpp28
1 files changed, 22 insertions, 6 deletions
diff --git a/src/analysis/statement.cpp b/src/analysis/statement.cpp
index a5aba2d..281d8e5 100644
--- a/src/analysis/statement.cpp
+++ b/src/analysis/statement.cpp
@@ -56,6 +56,16 @@ void analyseCondition(Node *node,
condNode = skipNop(condNode);
thenNode = skipNop(thenNode);
elseNode = skipNop(elseNode);
+ Node *const parent = skipBackNop(node->parent);
+ bool report(true);
+
+ if (parent == INIT_EXPR && parent->parent)
+ {
+ if (skipBackNop(parent->parent) == RETURN_EXPR)
+ {
+ report = false;
+ }
+ }
WalkItem wci = wi;
WalkItem wco = wo;
@@ -76,9 +86,12 @@ void analyseCondition(Node *node,
wo2 = wi2;
Log::dumpWI(node, "wi2 then ", wi2);
- reportParmDeclNullPointer(node,
- thenNode,
- wi2);
+ if (report)
+ {
+ reportParmDeclNullPointer(node,
+ thenNode,
+ wi2);
+ }
reportParmDeclLeftNullPointer(node, thenNode, wi2);
walkTree(thenNode, wi2, wo2);
Log::dumpWI(node, "wo2 then ", wo2);
@@ -96,9 +109,12 @@ void analyseCondition(Node *node,
wo3 = wi3;
Log::dumpWI(node, "wi3 else ", wi3);
- reportParmDeclNullPointer(node,
- elseNode,
- wi3);
+ if (report)
+ {
+ reportParmDeclNullPointer(node,
+ elseNode,
+ wi3);
+ }
reportParmDeclLeftNullPointer(node, elseNode, wi3);
walkTree(elseNode, wi3, wo3);
Log::dumpWI(node, "wo3 else ", wo3);