summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-08-18 14:44:35 +0300
committerAndrei Karas <akaras@inbox.ru>2015-08-18 14:44:35 +0300
commit1c20242a0668def67d0f76b5cef4d59c239bb7ae (patch)
tree5094e1fcbea08eb993c63c34fef344d2648c8983
parent76aa2ffb6e9ef9cae6a9ffcb61655a6384ebc7d6 (diff)
downloadparanucker-1c20242a0668def67d0f76b5cef4d59c239bb7ae.tar.gz
paranucker-1c20242a0668def67d0f76b5cef4d59c239bb7ae.tar.bz2
paranucker-1c20242a0668def67d0f76b5cef4d59c239bb7ae.tar.xz
paranucker-1c20242a0668def67d0f76b5cef4d59c239bb7ae.zip
Fix false positive like this: if (ptr && ptr->func())
-rw-r--r--src/analysis/expression.cpp17
1 files changed, 16 insertions, 1 deletions
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp
index 509faa0..edd1615 100644
--- a/src/analysis/expression.cpp
+++ b/src/analysis/expression.cpp
@@ -428,7 +428,22 @@ void analysePointerPlusExpr(PointerPlusExprNode *node,
return;
VarItem var = getVariableName(node->args[0]);
- reportParmDeclNullPointer(node, node->args[0], wi);
+ if (!var.empty())
+ {
+ if (!var.isNonNull &&
+ isNotIn(var.name, wi.knownNonNullVars))
+ {
+ reportParmDeclNullPointer(node, node->args[0], wi);
+ }
+ else if (var.isNonNull)
+ {
+ addNonNullVar(wo, var.name);
+ }
+ else
+ {
+ addUnknownVar(wo, var.name);
+ }
+ }
}
void analyseAddrExpr(AddrExprNode *node,